Subversion Repositories Kolibri OS

Rev

Rev 5865 | Rev 5926 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5865 Rev 5867
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.7.0
8
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.7.0
9
 
9
 
10
Номер функции помещается в регистр eax.
10
Номер функции помещается в регистр eax.
11
Вызов системной функции осуществляется командой "int 0x40".
11
Вызов системной функции осуществляется командой "int 0x40".
12
Все регистры, кроме явно указанных в возвращаемом значении,
12
Все регистры, кроме явно указанных в возвращаемом значении,
13
    включая регистр флагов eflags, сохраняются.
13
    включая регистр флагов eflags, сохраняются.
14
 
14
 
15
 
15
 
16
======================================================================
16
======================================================================
17
============== Функция 0 - определить и нарисовать окно. =============
17
============== Функция 0 - определить и нарисовать окно. =============
18
======================================================================
18
======================================================================
19
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
19
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
20
область. Для окон со скином определяет стандартные кнопки закрытия и
20
область. Для окон со скином определяет стандартные кнопки закрытия и
21
минимизации.
21
минимизации.
22
Параметры:
22
Параметры:
23
  * eax = 0 - номер функции
23
  * eax = 0 - номер функции
24
  * ebx = [координата по оси x]*65536 + [размер по оси x]
24
  * ebx = [координата по оси x]*65536 + [размер по оси x]
25
  * ecx = [координата по оси y]*65536 + [размер по оси y]
25
  * ecx = [координата по оси y]*65536 + [размер по оси y]
26
  * edx = 0xXYRRGGBB, где:
26
  * edx = 0xXYRRGGBB, где:
27
    * Y = стиль окна:
27
    * Y = стиль окна:
28
      * Y=0 - тип I - окно фиксированных размеров
28
      * Y=0 - тип I - окно фиксированных размеров
29
      * Y=1 - только определить область окна, ничего не рисовать
29
      * Y=1 - только определить область окна, ничего не рисовать
30
      * Y=2 - тип II - окно изменяемых размеров
30
      * Y=2 - тип II - окно изменяемых размеров
31
      * Y=3 - окно со скином
31
      * Y=3 - окно со скином
32
      * Y=4 - окно со скином фиксированных размеров
32
      * Y=4 - окно со скином фиксированных размеров
33
      * остальные возможные значения (от 5 до 15) зарезервированы,
33
      * остальные возможные значения (от 5 до 15) зарезервированы,
34
        вызов функции с такими Y игнорируется
34
        вызов функции с такими Y игнорируется
35
    * RR, GG, BB = соответственно красная, зеленая, синяя
35
    * RR, GG, BB = соответственно красная, зеленая, синяя
36
      составляющие цвета рабочей области окна
36
      составляющие цвета рабочей области окна
37
      (игнорируется для стиля Y=1)
37
      (игнорируется для стиля Y=1)
38
    * X = DCBA (биты)
38
    * X = DCBA (биты)
39
      * A = 1 - у окна есть заголовок; для стилей Y=3,4 адрес строки
39
      * A = 1 - у окна есть заголовок; для стилей Y=3,4 адрес строки
40
                  заголовка задаётся в edi, для прочих стилей
40
                  заголовка задаётся в edi, для прочих стилей
41
                  используется подфункция 1 функции 71
41
                  используется подфункция 1 функции 71
42
      * B = 1 - координаты всех графических примитивов задаются
42
      * B = 1 - координаты всех графических примитивов задаются
43
                  относительно клиентской области окна
43
                  относительно клиентской области окна
44
      * C = 1 - не закрашивать рабочую область при отрисовке окна
44
      * C = 1 - не закрашивать рабочую область при отрисовке окна
45
      * D = 0 - нормальная заливка рабочей области, 1 - градиентная
45
      * D = 0 - нормальная заливка рабочей области, 1 - градиентная
46
    Следующие параметры предназначены для окон типа I и II и
46
    Следующие параметры предназначены для окон типа I и II и
47
    игнорируются для стилей Y=1,3:
47
    игнорируются для стилей Y=1,3:
48
  * esi = 0xXYRRGGBB - цвет заголовка
48
  * esi = 0xXYRRGGBB - цвет заголовка
49
    * RR, GG, BB определяют сам цвет
49
    * RR, GG, BB определяют сам цвет
50
    * Y=0 - обычное окно, Y=1 - неперемещаемое окно (работает для всех стилей окон)
50
    * Y=0 - обычное окно, Y=1 - неперемещаемое окно (работает для всех стилей окон)
51
    * X определяет градиент заголовка: X=0 - нет градиента,
51
    * X определяет градиент заголовка: X=0 - нет градиента,
52
      X=8 - обычный градиент,
52
      X=8 - обычный градиент,
53
      для окон типа II X=4 - негативный градиент
53
      для окон типа II X=4 - негативный градиент
54
    * прочие значения X и Y зарезервированы
54
    * прочие значения X и Y зарезервированы
55
  * edi = 0x00RRGGBB - цвет рамки
55
  * edi = 0x00RRGGBB - цвет рамки
56
Возвращаемое значение:
56
Возвращаемое значение:
57
  * функция не возвращает значения
57
  * функция не возвращает значения
58
Замечания:
58
Замечания:
59
  * Положение и размеры окна устанавливаются при первом вызове
59
  * Положение и размеры окна устанавливаются при первом вызове
60
    этой функции и игнорируются при последующих; для изменения
60
    этой функции и игнорируются при последующих; для изменения
61
    положения и/или размеров уже созданного окна используйте
61
    положения и/или размеров уже созданного окна используйте
62
    67-ю функцию.
62
    67-ю функцию.
63
  * Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
63
  * Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
64
    устанавливается при первом вызове этой функции и игнорируется при
64
    устанавливается при первом вызове этой функции и игнорируется при
65
    последующих (точнее говоря, игнорируется после вызова
65
    последующих (точнее говоря, игнорируется после вызова
66
    подфункции 2 функции 12 - конца перерисовки);
66
    подфункции 2 функции 12 - конца перерисовки);
67
    для изменения строки заголовка уже созданного окна используйте
67
    для изменения строки заголовка уже созданного окна используйте
68
    подфункцию 1 функции 71.
68
    подфункцию 1 функции 71.
69
  * Если использовать окна соответствующих стилей, то положение
69
  * Если использовать окна соответствующих стилей, то положение
70
    и/или размеры окна могут меняться пользователем.
70
    и/или размеры окна могут меняться пользователем.
71
    Текущие положение и размеры могут быть получены вызовом функции 9.
71
    Текущие положение и размеры могут быть получены вызовом функции 9.
72
  * Окно должно умещаться на экране. Если переданные координаты
72
  * Окно должно умещаться на экране. Если переданные координаты
73
    и размеры не удовлетворяют этому условию, то соответствующая
73
    и размеры не удовлетворяют этому условию, то соответствующая
74
    координата (или, возможно, обе) считается нулем, а если и это
74
    координата (или, возможно, обе) считается нулем, а если и это
75
    не помогает, то соответствующий размер (или, возможно, оба)
75
    не помогает, то соответствующий размер (или, возможно, оба)
76
    устанавливается в размер экрана.
76
    устанавливается в размер экрана.
77
 
77
 
78
    Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
78
    Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
79
    в ebx,ecx. Координаты приводятся относительно левого верхнего
79
    в ebx,ecx. Координаты приводятся относительно левого верхнего
80
    угла окна, который, таким образом, задается как (0,0), координаты
80
    угла окна, который, таким образом, задается как (0,0), координаты
81
    правого нижнего угла суть (xsize,ysize).
81
    правого нижнего угла суть (xsize,ysize).
82
  * Размеры окна понимаются в смысле координат правого нижнего угла.
82
  * Размеры окна понимаются в смысле координат правого нижнего угла.
83
    Это же относится и ко всем остальным функциям.
83
    Это же относится и ко всем остальным функциям.
84
    Это означает, что реальные размеры на 1 пиксель больше.
84
    Это означает, что реальные размеры на 1 пиксель больше.
85
  * Вид окна типа I:
85
  * Вид окна типа I:
86
    * рисуется внешняя рамка цвета, указанного в edi,
86
    * рисуется внешняя рамка цвета, указанного в edi,
87
      шириной 1 пиксель
87
      шириной 1 пиксель
88
    * рисуется заголовок - прямоугольник с левым верхним углом (1,1)
88
    * рисуется заголовок - прямоугольник с левым верхним углом (1,1)
89
      и правым нижним (xsize-1,min(20,ysize-1)) цвета, указанного в esi
89
      и правым нижним (xsize-1,min(20,ysize-1)) цвета, указанного в esi
90
      (с учетом градиента)
90
      (с учетом градиента)
91
    * если ysize>21, то закрашивается рабочая область окна -
91
    * если ysize>21, то закрашивается рабочая область окна -
92
      прямоугольник с левым верхним углом (1,21) и правым нижним
92
      прямоугольник с левым верхним углом (1,21) и правым нижним
93
      (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
93
      (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
94
      указанным в edx (с учетом градиента)
94
      указанным в edx (с учетом градиента)
95
    * если A=1 и строка заголовка установлена подфункцией 1
95
    * если A=1 и строка заголовка установлена подфункцией 1
96
      функции 71, то она выводится в соответствующем месте заголовка
96
      функции 71, то она выводится в соответствующем месте заголовка
97
  * Вид окна стиля Y=1:
97
  * Вид окна стиля Y=1:
98
    * полностью определяется приложением
98
    * полностью определяется приложением
99
  * Вид окна типа II:
99
  * Вид окна типа II:
100
    * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
100
    * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
101
      edi (все составляющие цвета уменьшаются в два раза)
101
      edi (все составляющие цвета уменьшаются в два раза)
102
    * рисуется промежуточная рамка шириной 3 пикселя цвета edi
102
    * рисуется промежуточная рамка шириной 3 пикселя цвета edi
103
    * рисуется внутренняя рамка шириной 1 пиксель
103
    * рисуется внутренняя рамка шириной 1 пиксель
104
      "затенённого" цвета edi
104
      "затенённого" цвета edi
105
    * рисуется заголовок - прямоугольник с левым верхним углом (4,4)
105
    * рисуется заголовок - прямоугольник с левым верхним углом (4,4)
106
      и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
106
      и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
107
      (с учетом градиента)
107
      (с учетом градиента)
108
    * если ysize>=26, то закрашивается рабочая область окна -
108
    * если ysize>=26, то закрашивается рабочая область окна -
109
      прямоугольник с левым верхним углом (5,20) и правым нижним
109
      прямоугольник с левым верхним углом (5,20) и правым нижним
110
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
110
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
111
    * если A=1 и строка заголовка установлена подфункцией 1
111
    * если A=1 и строка заголовка установлена подфункцией 1
112
      функции 71, то она выводится в соответствующем месте заголовка
112
      функции 71, то она выводится в соответствующем месте заголовка
113
  * Вид окна со скином:
113
  * Вид окна со скином:
114
    * рисуется внешняя рамка шириной 1 пиксель
114
    * рисуется внешняя рамка шириной 1 пиксель
115
      цвета 'outer' из скина
115
      цвета 'outer' из скина
116
    * рисуется промежуточная рамка шириной 3 пикселя
116
    * рисуется промежуточная рамка шириной 3 пикселя
117
      цвета 'frame' из скина
117
      цвета 'frame' из скина
118
    * рисуется внутренняя рамка шириной 1 пиксель
118
    * рисуется внутренняя рамка шириной 1 пиксель
119
      цвета 'inner' из скина
119
      цвета 'inner' из скина
120
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
120
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
121
      (0,0) - (xsize,_skinh-1)
121
      (0,0) - (xsize,_skinh-1)
122
    * если ysize>=26, то закрашивается рабочая область окна -
122
    * если ysize>=26, то закрашивается рабочая область окна -
123
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
123
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
124
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
124
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
125
    * определяются две стандартные кнопки: закрытия и минимизации
125
    * определяются две стандартные кнопки: закрытия и минимизации
126
      (смотри функцию 8)
126
      (смотри функцию 8)
127
    * если A=1 и в edi (ненулевой) указатель на строку заголовка,
127
    * если A=1 и в edi (ненулевой) указатель на строку заголовка,
128
      то она выводится в заголовке в месте, определяемом скином
128
      то она выводится в заголовке в месте, определяемом скином
129
    * Значение переменной _skinh доступно как результат вызова
129
    * Значение переменной _skinh доступно как результат вызова
130
      подфункции 4 функции 48
130
      подфункции 4 функции 48
131
 
131
 
132
======================================================================
132
======================================================================
133
================= Функция 1 - поставить точку в окне. ================
133
================= Функция 1 - поставить точку в окне. ================
134
======================================================================
134
======================================================================
135
Параметры:
135
Параметры:
136
  * eax = 1 - номер функции
136
  * eax = 1 - номер функции
137
  * ebx = x-координата (относительно окна)
137
  * ebx = x-координата (относительно окна)
138
  * ecx = y-координата (относительно окна)
138
  * ecx = y-координата (относительно окна)
139
  * edx = 0x00RRGGBB - цвет точки
139
  * edx = 0x00RRGGBB - цвет точки
140
    edx = 0x01xxxxxx - инвертировать цвет точки
140
    edx = 0x01xxxxxx - инвертировать цвет точки
141
          (младшие 24 бита игнорируются)
141
          (младшие 24 бита игнорируются)
142
Возвращаемое значение:
142
Возвращаемое значение:
143
  * функция не возвращает значения
143
  * функция не возвращает значения
144
 
144
 
145
======================================================================
145
======================================================================
146
============== Функция 2 - получить код нажатой клавиши. =============
146
============== Функция 2 - получить код нажатой клавиши. =============
147
======================================================================
147
======================================================================
148
Забирает код нажатой клавиши из буфера.
148
Забирает код нажатой клавиши из буфера.
149
Параметры:
149
Параметры:
150
  * eax = 2 - номер функции
150
  * eax = 2 - номер функции
151
Возвращаемое значение:
151
Возвращаемое значение:
152
  * если буфер пуст, возвращается eax=1
152
  * если буфер пуст, возвращается eax=1
153
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
153
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
154
    биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
154
    биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
155
               в режме сканкодов биты обнулены.
155
               в режме сканкодов биты обнулены.
156
    биты 23-31 обнулены
156
    биты 23-31 обнулены
157
  * если есть "горячая клавиша", то возвращается
157
  * если есть "горячая клавиша", то возвращается
158
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
158
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
159
    старшее слово регистра eax содержит состояние управляющих клавиш
159
    старшее слово регистра eax содержит состояние управляющих клавиш
160
    в момент нажатия горячей клавиши
160
    в момент нажатия горячей клавиши
161
Замечания:
161
Замечания:
162
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
162
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
163
    организованный как очередь.
163
    организованный как очередь.
164
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
164
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
165
  * При вызове этой функции приложением с неактивным окном
165
  * При вызове этой функции приложением с неактивным окном
166
    считается, что буфер нажатых клавиш пуст.
166
    считается, что буфер нажатых клавиш пуст.
167
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
167
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
168
    режим сканкодов (и назад) можно с использованием функции 66.
168
    режим сканкодов (и назад) можно с использованием функции 66.
169
    Однако, горячие клавиши всегда возвращаются как сканкоды.
169
    Однако, горячие клавиши всегда возвращаются как сканкоды.
170
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
170
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
171
    запустив приложения keyascii и scancode.
171
    запустив приложения keyascii и scancode.
172
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
172
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
173
    ASCII-коды получаются с использованием таблиц преобразования,
173
    ASCII-коды получаются с использованием таблиц преобразования,
174
    которые можно установить подфункцией 2 функции 21 и прочитать
174
    которые можно установить подфункцией 2 функции 21 и прочитать
175
    подфункцией 2 функции 26.
175
    подфункцией 2 функции 26.
176
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
176
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
177
    (rus/en) в отличие от сканкодов.
177
    (rus/en) в отличие от сканкодов.
178
  * Поступает информация только о тех горячих клавишах, которые были
178
  * Поступает информация только о тех горячих клавишах, которые были
179
    определены этим потоком подфункцией 4 функции 66.
179
    определены этим потоком подфункцией 4 функции 66.
180
 
180
 
181
======================================================================
181
======================================================================
182
================ Функция 3 - получить системное время. ===============
182
================ Функция 3 - получить системное время. ===============
183
======================================================================
183
======================================================================
184
Параметры:
184
Параметры:
185
  * eax = 3 - номер функции
185
  * eax = 3 - номер функции
186
Возвращаемое значение:
186
Возвращаемое значение:
187
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
187
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
188
  * каждый элемент возвращается как BCD-число, например,
188
  * каждый элемент возвращается как BCD-число, например,
189
    для времени 23:59:59 результат будет 0x00595923
189
    для времени 23:59:59 результат будет 0x00595923
190
Замечания:
190
Замечания:
191
  * Смотри также подфункцию 9 функции 26 - получение времени
191
  * Смотри также подфункцию 9 функции 26 - получение времени
192
    с момента запуска системы; она во многих случаях удобнее,
192
    с момента запуска системы; она во многих случаях удобнее,
193
    поскольку возвращает просто DWORD-значение счетчика времени.
193
    поскольку возвращает просто DWORD-значение счетчика времени.
194
  * Системное время можно установить функцией 22.
194
  * Системное время можно установить функцией 22.
195
 
195
 
196
======================================================================
196
======================================================================
197
================ Функция 4 - нарисовать строку текста. ===============
197
================ Функция 4 - нарисовать строку текста. ===============
198
======================================================================
198
======================================================================
199
Параметры:
199
Параметры:
200
  * eax = 4 - номер функции
200
  * eax = 4 - номер функции
201
  * ebx = X*65536+Y, координаты в окне или буфере
201
  * ebx = X*65536+Y, координаты в окне или буфере
202
  * ecx = 0xXXRRGGBB, где
202
  * ecx = 0xXXRRGGBB, где
203
    * RR, GG, BB задают цвет текста
203
    * RR, GG, BB задают цвет текста
204
    * XX=ABFFCSSS (биты):
204
    * XX=ABFFCSSS (биты):
205
      * A=1 - рисуемая строка заканчивается нулём
205
      * A=1 - рисуемая строка заканчивается нулём
206
      * B=1 - закрашивать фон (цвет = edi)
206
      * B=1 - закрашивать фон (цвет = edi)
207
      * FF задает шрифт и кодировку:
207
      * FF задает шрифт и кодировку:
208
        0 = 6x9  cp866
208
        0 = 6x9  cp866
-
 
209
        1 = 8x16 cp866
209
        2 = 8x16 UTF-16LE
210
        2 = 8x16 UTF-16LE
210
        3 = 8x16 UTF-8
211
        3 = 8x16 UTF-8
211
      * C=0 - рисовать в окно,
212
      * C=0 - рисовать в окно,
212
        С=1 - рисовать в буфер (edi)
213
        С=1 - рисовать в буфер (edi)
213
      * SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
214
      * SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
214
  * edx = указатель на начало строки
215
  * edx = указатель на начало строки
215
  * esi = для A=0 длина строки, для A=1 игнорируется
216
  * esi = для A=0 длина строки, для A=1 игнорируется
216
  * edi = если B=1 - цвет для закраски фона,
217
  * edi = если B=1 - цвет для закраски фона,
217
          если C=1 - указатель на буфер
218
          если C=1 - указатель на буфер
218
 
219
 
219
Возвращаемое значение:
220
Возвращаемое значение:
220
  * функция не возвращает значения
221
  * функция не возвращает значения
221
Замечания:
222
Замечания:
222
  * Нельзя одновременно использовать B=1 и C=1,
223
  * Нельзя одновременно использовать B=1 и C=1,
223
    поскольку в обоих случаях используется регистр edi.
224
    поскольку в обоих случаях используется регистр edi.
224
  * Если SSS=0, шрифт может сглаживаться,
225
  * Если SSS=0, шрифт может сглаживаться,
225
    в зависимости от системной настройки.
226
    в зависимости от системной настройки.
226
  * Структура буфера:
227
  * Структура буфера:
227
Xsize       dd
228
Xsize       dd
228
Ysize       dd
229
Ysize       dd
229
picture     rb  Xsize*Ysize*4  ; 32 бита
230
picture     rb  Xsize*Ysize*4  ; 32 бита
230
 
231
 
231
======================================================================
232
======================================================================
232
========================= Функция 5 - пауза. =========================
233
========================= Функция 5 - пауза. =========================
233
======================================================================
234
======================================================================
234
Задерживает выполнение программы на заданное время.
235
Задерживает выполнение программы на заданное время.
235
Параметры:
236
Параметры:
236
  * eax = 5 - номер функции
237
  * eax = 5 - номер функции
237
  * ebx = время в сотых долях секунды
238
  * ebx = время в сотых долях секунды
238
Возвращаемое значение:
239
Возвращаемое значение:
239
  * функция не возвращает значения
240
  * функция не возвращает значения
240
Замечания:
241
Замечания:
241
  * Передача ebx=0 не передает управление следующему процессу и
242
  * Передача ebx=0 не передает управление следующему процессу и
242
    вообще не производит никаких действий. Если действительно
243
    вообще не производит никаких действий. Если действительно
243
    требуется передать управление следующему процессу
244
    требуется передать управление следующему процессу
244
    (закончить текущий квант времени), используйте подфункцию 1
245
    (закончить текущий квант времени), используйте подфункцию 1
245
    функции 68.
246
    функции 68.
246
 
247
 
247
======================================================================
248
======================================================================
248
=============== Функция 6 - прочитать файл с рамдиска. ===============
249
=============== Функция 6 - прочитать файл с рамдиска. ===============
249
======================================================================
250
======================================================================
250
Параметры:
251
Параметры:
251
  * eax = 6 - номер функции
252
  * eax = 6 - номер функции
252
  * ebx = указатель на имя файла
253
  * ebx = указатель на имя файла
253
  * ecx = номер стартового блока, считая с 1;
254
  * ecx = номер стартового блока, считая с 1;
254
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
255
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
255
  * edx = число блоков для чтения;
256
  * edx = число блоков для чтения;
256
    edx=0 - читать один блок (то же самое, что и edx=1)
257
    edx=0 - читать один блок (то же самое, что и edx=1)
257
  * esi = указатель на область памяти, куда будут записаны данные
258
  * esi = указатель на область памяти, куда будут записаны данные
258
Возвращаемое значение:
259
Возвращаемое значение:
259
  * eax = длина файла в байтах, если файл успешно прочитан
260
  * eax = длина файла в байтах, если файл успешно прочитан
260
  * eax = -1, если файл не найден
261
  * eax = -1, если файл не найден
261
Замечания:
262
Замечания:
262
  * Данная функция является устаревшей; функция 70
263
  * Данная функция является устаревшей; функция 70
263
    позволяет выполнять те же действия с расширенными возможностями.
264
    позволяет выполнять те же действия с расширенными возможностями.
264
  * Блок = 512 байт.
265
  * Блок = 512 байт.
265
  * Для чтения всего файла можно указать заведомо большое значение
266
  * Для чтения всего файла можно указать заведомо большое значение
266
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
267
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
267
    что программа "упадет", если файл окажется слишком большим
268
    что программа "упадет", если файл окажется слишком большим
268
    и "не влезет" в память программы.
269
    и "не влезет" в память программы.
269
  * Имя файла должно быть либо в формате 8+3 символов
270
  * Имя файла должно быть либо в формате 8+3 символов
270
    (первые 8 символов - собственно имя, последние 3 - расширение,
271
    (первые 8 символов - собственно имя, последние 3 - расширение,
271
    короткие имена и расширения дополняются пробелами),
272
    короткие имена и расширения дополняются пробелами),
272
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
273
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
273
    (имя не более 8 символов, точка, расширение 3 символа,
274
    (имя не более 8 символов, точка, расширение 3 символа,
274
    дополненное при необходимости пробелами).
275
    дополненное при необходимости пробелами).
275
    Имя файла должно быть записано заглавными буквами.
276
    Имя файла должно быть записано заглавными буквами.
276
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
277
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
277
  * Эта функция не поддерживает папки на рамдиске.
278
  * Эта функция не поддерживает папки на рамдиске.
278
 
279
 
279
======================================================================
280
======================================================================
280
=============== Функция 7 - вывести изображение в окно. ==============
281
=============== Функция 7 - вывести изображение в окно. ==============
281
======================================================================
282
======================================================================
282
Параметры:
283
Параметры:
283
  * eax = 7 - номер функции
284
  * eax = 7 - номер функции
284
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
285
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
285
  * ecx = [размер по оси x]*65536 + [размер по оси y]
286
  * ecx = [размер по оси x]*65536 + [размер по оси y]
286
  * edx = [координата по оси x]*65536 + [координата по оси y]
287
  * edx = [координата по оси x]*65536 + [координата по оси y]
287
Возвращаемое значение:
288
Возвращаемое значение:
288
  * функция не возвращает значения
289
  * функция не возвращает значения
289
Замечания:
290
Замечания:
290
  * Координаты изображения - это координаты верхнего левого угла
291
  * Координаты изображения - это координаты верхнего левого угла
291
    изображения относительно окна.
292
    изображения относительно окна.
292
  * Размер изображения в байтах есть 3*xsize*ysize.
293
  * Размер изображения в байтах есть 3*xsize*ysize.
293
 
294
 
294
======================================================================
295
======================================================================
295
=============== Функция 8 - определить/удалить кнопку. ===============
296
=============== Функция 8 - определить/удалить кнопку. ===============
296
======================================================================
297
======================================================================
297
Параметры для определения кнопки:
298
Параметры для определения кнопки:
298
  * eax = 8 - номер функции
299
  * eax = 8 - номер функции
299
  * ebx = [координата по оси x]*65536 + [размер по оси x]
300
  * ebx = [координата по оси x]*65536 + [размер по оси x]
300
  * ecx = [координата по оси y]*65536 + [размер по оси y]
301
  * ecx = [координата по оси y]*65536 + [размер по оси y]
301
  * edx = 0xXYnnnnnn, где:
302
  * edx = 0xXYnnnnnn, где:
302
    * nnnnnn = идентификатор кнопки
303
    * nnnnnn = идентификатор кнопки
303
    * старший (31-й) бит edx сброшен
304
    * старший (31-й) бит edx сброшен
304
    * если 30-й бит edx установлен - не прорисовывать кнопку
305
    * если 30-й бит edx установлен - не прорисовывать кнопку
305
    * если 29-й бит edx установлен - не рисовать рамку
306
    * если 29-й бит edx установлен - не рисовать рамку
306
      при нажатии на кнопку
307
      при нажатии на кнопку
307
  * esi = 0x00RRGGBB - цвет кнопки
308
  * esi = 0x00RRGGBB - цвет кнопки
308
Параметры для удаления кнопки:
309
Параметры для удаления кнопки:
309
  * eax = 8 - номер функции
310
  * eax = 8 - номер функции
310
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
311
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
311
Возвращаемое значение:
312
Возвращаемое значение:
312
  * функция не возвращает значения
313
  * функция не возвращает значения
313
Замечания:
314
Замечания:
314
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
315
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
315
  * Для окон со скином при определении окна (вызове 0-й функции)
316
  * Для окон со скином при определении окна (вызове 0-й функции)
316
    создаются две стандартные кнопки - закрытия окна
317
    создаются две стандартные кнопки - закрытия окна
317
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
318
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
318
  * Создание двух кнопок с одинаковыми идентификаторами
319
  * Создание двух кнопок с одинаковыми идентификаторами
319
    вполне допустимо.
320
    вполне допустимо.
320
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
321
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
321
    системой как кнопка минимизации, система обрабатывает такое
322
    системой как кнопка минимизации, система обрабатывает такое
322
    нажатие самостоятельно, не обращаясь к приложению.
323
    нажатие самостоятельно, не обращаясь к приложению.
323
    В остальном это обычная кнопка.
324
    В остальном это обычная кнопка.
324
  * Общее количество кнопок для всех приложений ограничено
325
  * Общее количество кнопок для всех приложений ограничено
325
    числом 4095.
326
    числом 4095.
326
 
327
 
327
======================================================================
328
======================================================================
328
============= Функция 9 - информация о потоке выполнения. ============
329
============= Функция 9 - информация о потоке выполнения. ============
329
======================================================================
330
======================================================================
330
Параметры:
331
Параметры:
331
  * eax = 9 - номер функции
332
  * eax = 9 - номер функции
332
  * ebx = указатель на буфер размера 1 Кб
333
  * ebx = указатель на буфер размера 1 Кб
333
  * ecx = номер слота потока
334
  * ecx = номер слота потока
334
    ecx = -1 - получить информацию о текущем потоке
335
    ecx = -1 - получить информацию о текущем потоке
335
Возвращаемое значение:
336
Возвращаемое значение:
336
  * eax = максимальный номер слота потока
337
  * eax = максимальный номер слота потока
337
  * буфер, на который указывает ebx, содержит следующую информацию:
338
  * буфер, на который указывает ebx, содержит следующую информацию:
338
    * +0: dword: использование процессора (сколько тактов в секунду
339
    * +0: dword: использование процессора (сколько тактов в секунду
339
      уходит на исполнение именно этого потока)
340
      уходит на исполнение именно этого потока)
340
    * +4: word: позиция окна потока в оконном стэке
341
    * +4: word: позиция окна потока в оконном стэке
341
    * +6: word: (не имеет отношения к запрошенному потоку)
342
    * +6: word: (не имеет отношения к запрошенному потоку)
342
      номер слота потока, окно которого находится в оконном стэке
343
      номер слота потока, окно которого находится в оконном стэке
343
      в позиции ecx
344
      в позиции ecx
344
    * +8: word: зарезервировано
345
    * +8: word: зарезервировано
345
    * +10 = +0xA: 11 байт: имя процесса
346
    * +10 = +0xA: 11 байт: имя процесса
346
      (имя запущенного файла - исполняемый файл без расширения)
347
      (имя запущенного файла - исполняемый файл без расширения)
347
    * +21 = +0x15: byte: зарезервировано, этот байт не изменяется
348
    * +21 = +0x15: byte: зарезервировано, этот байт не изменяется
348
    * +22 = +0x16: dword: адрес процесса в памяти
349
    * +22 = +0x16: dword: адрес процесса в памяти
349
    * +26 = +0x1A: dword: размер используемой памяти - 1
350
    * +26 = +0x1A: dword: размер используемой памяти - 1
350
    * +30 = +0x1E: dword: идентификатор (PID/TID)
351
    * +30 = +0x1E: dword: идентификатор (PID/TID)
351
    * +34 = +0x22: dword: координата окна потока по оси x
352
    * +34 = +0x22: dword: координата окна потока по оси x
352
    * +38 = +0x26: dword: координата окна потока по оси y
353
    * +38 = +0x26: dword: координата окна потока по оси y
353
    * +42 = +0x2A: dword: размер окна потока по оси x
354
    * +42 = +0x2A: dword: размер окна потока по оси x
354
    * +46 = +0x2E: dword: размер окна потока по оси y
355
    * +46 = +0x2E: dword: размер окна потока по оси y
355
    * +50 = +0x32: word: состояние слота потока:
356
    * +50 = +0x32: word: состояние слота потока:
356
      * 0 = поток выполняется
357
      * 0 = поток выполняется
357
      * 1 = поток приостановлен
358
      * 1 = поток приостановлен
358
      * 2 = поток приостановлен в момент ожидания события
359
      * 2 = поток приостановлен в момент ожидания события
359
      * 3 = поток завершается в результате вызова функции -1 или
360
      * 3 = поток завершается в результате вызова функции -1 или
360
        насильственно как следствие вызова подфункции 2 функции 18
361
        насильственно как следствие вызова подфункции 2 функции 18
361
        или завершения работы системы
362
        или завершения работы системы
362
      * 4 = поток завершается в результате исключения
363
      * 4 = поток завершается в результате исключения
363
      * 5 = поток ожидает события
364
      * 5 = поток ожидает события
364
      * 9 = запрошенный слот свободен, вся остальная информация о
365
      * 9 = запрошенный слот свободен, вся остальная информация о
365
        слоте не имеет смысла
366
        слоте не имеет смысла
366
    * +52 = +0x34: word: зарезервировано, это слово не изменяется
367
    * +52 = +0x34: word: зарезервировано, это слово не изменяется
367
    * +54 = +0x36: dword: координата начала клиентской области
368
    * +54 = +0x36: dword: координата начала клиентской области
368
                          по оси x
369
                          по оси x
369
    * +58 = +0x3A: dword: координата начала клиентской области
370
    * +58 = +0x3A: dword: координата начала клиентской области
370
                          по оси y
371
                          по оси y
371
    * +62 = +0x3E: dword: ширина клиентской области
372
    * +62 = +0x3E: dword: ширина клиентской области
372
    * +66 = +0x42: dword: высота клиентской области
373
    * +66 = +0x42: dword: высота клиентской области
373
    * +70 = +0x46: byte: состояние окна - битовое поле
374
    * +70 = +0x46: byte: состояние окна - битовое поле
374
      * бит 0 (маска 1): окно максимизировано
375
      * бит 0 (маска 1): окно максимизировано
375
      * бит 1 (маска 2): окно минимизировано в панель задач
376
      * бит 1 (маска 2): окно минимизировано в панель задач
376
      * бит 2 (маска 4): окно свёрнуто в заголовок
377
      * бит 2 (маска 4): окно свёрнуто в заголовок
377
    * +71 = +0x47: dword: маска событий
378
    * +71 = +0x47: dword: маска событий
378
    * +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
379
    * +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
379
Замечания:
380
Замечания:
380
  * Слоты нумеруются с 1.
381
  * Слоты нумеруются с 1.
381
  * Возвращаемое значение не есть общее число потоков, поскольку
382
  * Возвращаемое значение не есть общее число потоков, поскольку
382
    бывают свободные слоты.
383
    бывают свободные слоты.
383
  * При создании процесса автоматически создается поток выполнения.
384
  * При создании процесса автоматически создается поток выполнения.
384
  * Функция выдает информацию о потоке. Каждый процесс имеет
385
  * Функция выдает информацию о потоке. Каждый процесс имеет
385
    хотя бы один поток. Один процесс может создать несколько потоков,
386
    хотя бы один поток. Один процесс может создать несколько потоков,
386
    в этом случае каждый поток получает свой слот, причем поля
387
    в этом случае каждый поток получает свой слот, причем поля
387
    +10, +22, +26 в этих слотах совпадают.
388
    +10, +22, +26 в этих слотах совпадают.
388
    Для приложений не существует общего способа определить,
389
    Для приложений не существует общего способа определить,
389
    принадлежат ли два потока одному процессу.
390
    принадлежат ли два потока одному процессу.
390
  * Активное окно - окно, находящееся на вершине оконного стэка,
391
  * Активное окно - окно, находящееся на вершине оконного стэка,
391
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
392
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
392
    оконном стэке совпадает с возвращаемым значением.
393
    оконном стэке совпадает с возвращаемым значением.
393
  * Слот 1 соответствует специальному потоку операционной системы,
394
  * Слот 1 соответствует специальному потоку операционной системы,
394
    для которого:
395
    для которого:
395
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
396
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
396
      значение 1
397
      значение 1
397
    * имя процесса - "OS/IDLE" (дополненное пробелами)
398
    * имя процесса - "OS/IDLE" (дополненное пробелами)
398
    * адрес процесса в памяти равен 0, размер используемой памяти
399
    * адрес процесса в памяти равен 0, размер используемой памяти
399
      16 Mb (0x1000000)
400
      16 Mb (0x1000000)
400
    * PID=1
401
    * PID=1
401
    * координаты и размеры окна, равно как и клиентской области,
402
    * координаты и размеры окна, равно как и клиентской области,
402
      условно полагаются равными 0
403
      условно полагаются равными 0
403
    * состояние слота - всегда 0 (выполняется)
404
    * состояние слота - всегда 0 (выполняется)
404
    * время выполнения складывается из времени, уходящего на
405
    * время выполнения складывается из времени, уходящего на
405
      собственно работу, и времени простоя в ожидании прерывания
406
      собственно работу, и времени простоя в ожидании прерывания
406
      (которое можно получить вызовом подфункции 4 функции 18).
407
      (которое можно получить вызовом подфункции 4 функции 18).
407
  * Начиная со слота 2, размещаются обычные приложения.
408
  * Начиная со слота 2, размещаются обычные приложения.
408
  * Обычные приложения размещаются в памяти по адресу 0
409
  * Обычные приложения размещаются в памяти по адресу 0
409
    (константа ядра std_application_base_address).
410
    (константа ядра std_application_base_address).
410
    Наложения не происходит, поскольку у каждого процесса своя
411
    Наложения не происходит, поскольку у каждого процесса своя
411
    таблица страниц.
412
    таблица страниц.
412
  * При создании потока ему назначаются слот в системной таблице и
413
  * При создании потока ему назначаются слот в системной таблице и
413
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
414
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
414
    заданного потока не изменяются со временем.
415
    заданного потока не изменяются со временем.
415
    После завершения потока его слот может быть заново использован
416
    После завершения потока его слот может быть заново использован
416
    для другого потока. Идентификатор потока не может быть назначен
417
    для другого потока. Идентификатор потока не может быть назначен
417
    другому потоку даже после завершения первого.
418
    другому потоку даже после завершения первого.
418
    Назначаемые новым потокам идентификаторы монотонно растут.
419
    Назначаемые новым потокам идентификаторы монотонно растут.
419
  * Если поток еще не определил свое окно вызовом функции 0, то
420
  * Если поток еще не определил свое окно вызовом функции 0, то
420
    положение и размеры этого окна полагаются нулями.
421
    положение и размеры этого окна полагаются нулями.
421
  * Координаты клиентской области окна берутся относительно окна.
422
  * Координаты клиентской области окна берутся относительно окна.
422
  * В данный момент используется только часть буфера размером
423
  * В данный момент используется только часть буфера размером
423
    76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
424
    76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
424
    размером 1 Кб для будущей совместимости, в будущем могут быть
425
    размером 1 Кб для будущей совместимости, в будущем могут быть
425
    добавлены некоторые поля.
426
    добавлены некоторые поля.
426
 
427
 
427
======================================================================
428
======================================================================
428
==================== Функция 10 - ожидать события. ===================
429
==================== Функция 10 - ожидать события. ===================
429
======================================================================
430
======================================================================
430
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
431
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
431
В таком состоянии поток не получает процессорного времени.
432
В таком состоянии поток не получает процессорного времени.
432
Затем считывает сообщение из очереди.
433
Затем считывает сообщение из очереди.
433
 
434
 
434
Параметры:
435
Параметры:
435
  * eax = 10 - номер функции
436
  * eax = 10 - номер функции
436
Возвращаемое значение:
437
Возвращаемое значение:
437
  * eax = событие (смотри список событий)
438
  * eax = событие (смотри список событий)
438
Замечания:
439
Замечания:
439
  * Учитываются только те события, которые входят в маску,
440
  * Учитываются только те события, которые входят в маску,
440
    устанавливаемую функцией 40. По умолчанию это события
441
    устанавливаемую функцией 40. По умолчанию это события
441
    перерисовки, нажатия на клавиши и на кнопки.
442
    перерисовки, нажатия на клавиши и на кнопки.
442
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
443
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
443
    Чтобы ждать не более определенного времени, используйте
444
    Чтобы ждать не более определенного времени, используйте
444
    функцию 23.
445
    функцию 23.
445
 
446
 
446
======================================================================
447
======================================================================
447
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
448
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
448
======================================================================
449
======================================================================
449
Если в очереди сообщений есть какое-то событие, то считывает и
450
Если в очереди сообщений есть какое-то событие, то считывает и
450
возвращает его. Если очередь пуста, возвращает нуль.
451
возвращает его. Если очередь пуста, возвращает нуль.
451
Параметры:
452
Параметры:
452
  * eax = 11 - номер функции
453
  * eax = 11 - номер функции
453
Возвращаемое значение:
454
Возвращаемое значение:
454
  * eax = 0 - очередь сообщений пуста
455
  * eax = 0 - очередь сообщений пуста
455
  * иначе eax = событие (смотри список событий)
456
  * иначе eax = событие (смотри список событий)
456
Замечания:
457
Замечания:
457
  * Учитываются только те события, которые входят в маску,
458
  * Учитываются только те события, которые входят в маску,
458
    устанавливаемую функцией 40. По умолчанию это события
459
    устанавливаемую функцией 40. По умолчанию это события
459
    перерисовки, нажатия на клавиши и на кнопки.
460
    перерисовки, нажатия на клавиши и на кнопки.
460
  * Для ожидания появления события в очереди, используйте функцию 10.
461
  * Для ожидания появления события в очереди, используйте функцию 10.
461
    Чтобы ждать не более определенного времени, используйте
462
    Чтобы ждать не более определенного времени, используйте
462
    функцию 23.
463
    функцию 23.
463
 
464
 
464
======================================================================
465
======================================================================
465
=========== Функция 12 - начать/закончить перерисовку окна. ==========
466
=========== Функция 12 - начать/закончить перерисовку окна. ==========
466
======================================================================
467
======================================================================
467
 
468
 
468
-------------- Подфункция 1 - начать перерисовку окна. ---------------
469
-------------- Подфункция 1 - начать перерисовку окна. ---------------
469
Параметры:
470
Параметры:
470
  * eax = 12 - номер функции
471
  * eax = 12 - номер функции
471
  * ebx = 1 - номер подфункции
472
  * ebx = 1 - номер подфункции
472
Возвращаемое значение:
473
Возвращаемое значение:
473
  * функция не возвращает значения
474
  * функция не возвращает значения
474
 
475
 
475
------------- Подфункция 2 - закончить перерисовку окна. -------------
476
------------- Подфункция 2 - закончить перерисовку окна. -------------
476
Параметры:
477
Параметры:
477
  * eax = 12 - номер функции
478
  * eax = 12 - номер функции
478
  * ebx = 2 - номер подфункции
479
  * ebx = 2 - номер подфункции
479
Возвращаемое значение:
480
Возвращаемое значение:
480
  * функция не возвращает значения
481
  * функция не возвращает значения
481
Замечания:
482
Замечания:
482
  * Функция начала перерисовки удаляет все определённые
483
  * Функция начала перерисовки удаляет все определённые
483
    функцией 8 кнопки, их следует определить повторно.
484
    функцией 8 кнопки, их следует определить повторно.
484
 
485
 
485
======================================================================
486
======================================================================
486
============ Функция 13 - нарисовать прямоугольник в окне. ===========
487
============ Функция 13 - нарисовать прямоугольник в окне. ===========
487
======================================================================
488
======================================================================
488
Параметры:
489
Параметры:
489
  * eax = 13 - номер функции
490
  * eax = 13 - номер функции
490
  * ebx = [координата по оси x]*65536 + [размер по оси x]
491
  * ebx = [координата по оси x]*65536 + [размер по оси x]
491
  * ecx = [координата по оси y]*65536 + [размер по оси y]
492
  * ecx = [координата по оси y]*65536 + [размер по оси y]
492
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
493
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
493
Возвращаемое значение:
494
Возвращаемое значение:
494
  * функция не возвращает значения
495
  * функция не возвращает значения
495
Замечания:
496
Замечания:
496
  * Под координатами понимаются координаты левого верхнего угла
497
  * Под координатами понимаются координаты левого верхнего угла
497
    прямоугольника относительно окна.
498
    прямоугольника относительно окна.
498
 
499
 
499
======================================================================
500
======================================================================
500
================ Функция 14 - получить размеры экрана. ===============
501
================ Функция 14 - получить размеры экрана. ===============
501
======================================================================
502
======================================================================
502
Параметры:
503
Параметры:
503
  * eax = 14 - номер функции
504
  * eax = 14 - номер функции
504
Возвращаемое значение:
505
Возвращаемое значение:
505
  * eax = [xsize]*65536 + [ysize], где
506
  * eax = [xsize]*65536 + [ysize], где
506
  * xsize = x-координата правого нижнего угла экрана =
507
  * xsize = x-координата правого нижнего угла экрана =
507
            размер по горизонтали - 1
508
            размер по горизонтали - 1
508
  * ysize = y-координата правого нижнего угла экрана =
509
  * ysize = y-координата правого нижнего угла экрана =
509
            размер по вертикали - 1
510
            размер по вертикали - 1
510
Замечания:
511
Замечания:
511
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
512
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
512
    области экрана.
513
    области экрана.
513
 
514
 
514
======================================================================
515
======================================================================
515
= Функция 15, подфункция 1 - установить размер фонового изображения. =
516
= Функция 15, подфункция 1 - установить размер фонового изображения. =
516
======================================================================
517
======================================================================
517
Параметры:
518
Параметры:
518
  * eax = 15 - номер функции
519
  * eax = 15 - номер функции
519
  * ebx = 1 - номер подфункции
520
  * ebx = 1 - номер подфункции
520
  * ecx = ширина изображения
521
  * ecx = ширина изображения
521
  * edx = высота изображения
522
  * edx = высота изображения
522
Возвращаемое значение:
523
Возвращаемое значение:
523
  * функция не возвращает значения
524
  * функция не возвращает значения
524
Замечания:
525
Замечания:
525
  * Вызов функции обязателен перед вызовом подфункций 2 и 5.
526
  * Вызов функции обязателен перед вызовом подфункций 2 и 5.
526
  * Для обновления экрана (после завершения серии команд, работающих с
527
  * Для обновления экрана (после завершения серии команд, работающих с
527
    фоном) вызывайте подфункцию 3 перерисовки фона.
528
    фоном) вызывайте подфункцию 3 перерисовки фона.
528
  * Есть парная функция получения размеров фонового изображения -
529
  * Есть парная функция получения размеров фонового изображения -
529
    подфункция 1 функции 39.
530
    подфункция 1 функции 39.
530
 
531
 
531
======================================================================
532
======================================================================
532
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
533
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
533
======================================================================
534
======================================================================
534
Параметры:
535
Параметры:
535
  * eax = 15 - номер функции
536
  * eax = 15 - номер функции
536
  * ebx = 2 - номер подфункции
537
  * ebx = 2 - номер подфункции
537
  * ecx = смещение
538
  * ecx = смещение
538
  * edx = цвет точки 0xRRGGBB
539
  * edx = цвет точки 0xRRGGBB
539
Возвращаемое значение:
540
Возвращаемое значение:
540
  * функция не возвращает значения
541
  * функция не возвращает значения
541
Замечания:
542
Замечания:
542
  * Смещение для точки с координатами (x,y) вычисляется как
543
  * Смещение для точки с координатами (x,y) вычисляется как
543
    (x+y*xsize)*3.
544
    (x+y*xsize)*3.
544
  * Если указанное смещение превышает установленный подфункцией 1
545
  * Если указанное смещение превышает установленный подфункцией 1
545
    размер, вызов игнорируется.
546
    размер, вызов игнорируется.
546
  * Для обновления экрана (после завершения серии команд, работающих с
547
  * Для обновления экрана (после завершения серии команд, работающих с
547
    фоном) вызывайте подфункцию 3 перерисовки фона.
548
    фоном) вызывайте подфункцию 3 перерисовки фона.
548
  * Есть парная функция получения точки с фонового изображения -
549
  * Есть парная функция получения точки с фонового изображения -
549
    подфункция 2 функции 39.
550
    подфункция 2 функции 39.
550
 
551
 
551
======================================================================
552
======================================================================
552
============ Функция 15, подфункция 3 - перерисовать фон. ============
553
============ Функция 15, подфункция 3 - перерисовать фон. ============
553
======================================================================
554
======================================================================
554
Параметры:
555
Параметры:
555
  * eax = 15 - номер функции
556
  * eax = 15 - номер функции
556
  * ebx = 3 - номер подфункции
557
  * ebx = 3 - номер подфункции
557
Возвращаемое значение:
558
Возвращаемое значение:
558
  * функция не возвращает значения
559
  * функция не возвращает значения
559
 
560
 
560
======================================================================
561
======================================================================
561
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
562
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
562
======================================================================
563
======================================================================
563
Параметры:
564
Параметры:
564
  * eax = 15 - номер функции
565
  * eax = 15 - номер функции
565
  * ebx = 4 - номер подфункции
566
  * ebx = 4 - номер подфункции
566
  * ecx = режим отрисовки:
567
  * ecx = режим отрисовки:
567
    * 1 = замостить
568
    * 1 = замостить
568
    * 2 = растянуть
569
    * 2 = растянуть
569
Возвращаемое значение:
570
Возвращаемое значение:
570
  * функция не возвращает значения
571
  * функция не возвращает значения
571
Замечания:
572
Замечания:
572
  * Для обновления экрана (после завершения серии команд, работающих с
573
  * Для обновления экрана (после завершения серии команд, работающих с
573
    фоном) вызывайте подфункцию 3 перерисовки фона.
574
    фоном) вызывайте подфункцию 3 перерисовки фона.
574
  * Есть парная команда получения режима отрисовки фона -
575
  * Есть парная команда получения режима отрисовки фона -
575
    подфункция 4 функции 39.
576
    подфункция 4 функции 39.
576
 
577
 
577
======================================================================
578
======================================================================
578
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
579
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
579
======================================================================
580
======================================================================
580
Параметры:
581
Параметры:
581
  * eax = 15 - номер функции
582
  * eax = 15 - номер функции
582
  * ebx = 5 - номер подфункции
583
  * ebx = 5 - номер подфункции
583
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
584
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
584
  * edx = смещение в данных фонового изображения
585
  * edx = смещение в данных фонового изображения
585
  * esi = размер данных в байтах = 3 * число пикселей
586
  * esi = размер данных в байтах = 3 * число пикселей
586
Возвращаемое значение:
587
Возвращаемое значение:
587
  * функция не возвращает значения
588
  * функция не возвращает значения
588
Замечания:
589
Замечания:
589
  * Проверки корректности смещения и размера не производится.
590
  * Проверки корректности смещения и размера не производится.
590
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
591
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
591
  * Пиксели фонового изображения записываются последовательно
592
  * Пиксели фонового изображения записываются последовательно
592
    слева направо, сверху вниз.
593
    слева направо, сверху вниз.
593
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
594
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
594
  * Для обновления экрана (после завершения серии команд, работающих с
595
  * Для обновления экрана (после завершения серии команд, работающих с
595
    фоном) вызывайте подфункцию 3 перерисовки фона.
596
    фоном) вызывайте подфункцию 3 перерисовки фона.
596
 
597
 
597
======================================================================
598
======================================================================
598
====================== Функция 15, подфункция 6 ======================
599
====================== Функция 15, подфункция 6 ======================
599
==== Спроецировать данные фона на адресное пространство процесса. ====
600
==== Спроецировать данные фона на адресное пространство процесса. ====
600
======================================================================
601
======================================================================
601
Параметры:
602
Параметры:
602
  * eax = 15 - номер функции
603
  * eax = 15 - номер функции
603
  * ebx = 6 - номер подфункции
604
  * ebx = 6 - номер подфункции
604
Возвращаемое значение:
605
Возвращаемое значение:
605
  * eax = указатель на данные фона, 0 при ошибке
606
  * eax = указатель на данные фона, 0 при ошибке
606
Замечания:
607
Замечания:
607
  * Спроецированные данные доступны на чтение и запись.
608
  * Спроецированные данные доступны на чтение и запись.
608
  * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
609
  * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
609
    блокируется на время работы с спроецированными данными.
610
    блокируется на время работы с спроецированными данными.
610
  * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
611
  * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
611
  * Пиксели фонового изображения записываются последовательно
612
  * Пиксели фонового изображения записываются последовательно
612
    слева направо, сверху вниз.
613
    слева направо, сверху вниз.
613
 
614
 
614
======================================================================
615
======================================================================
615
====================== Функция 15, подфункция 7 ======================
616
====================== Функция 15, подфункция 7 ======================
616
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
617
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
617
======================================================================
618
======================================================================
618
Параметры:
619
Параметры:
619
  * eax = 15 - номер функции
620
  * eax = 15 - номер функции
620
  * ebx = 7 - номер подфункции
621
  * ebx = 7 - номер подфункции
621
  * ecx = указатель на данные фона
622
  * ecx = указатель на данные фона
622
Возвращаемое значение:
623
Возвращаемое значение:
623
  * eax = 1 при успехе, 0 при ошибке
624
  * eax = 1 при успехе, 0 при ошибке
624
 
625
 
625
======================================================================
626
======================================================================
626
====================== Функция 15, подфункция 8 ======================
627
====================== Функция 15, подфункция 8 ======================
627
=========== Получить координаты последней отрисовки фона. ============
628
=========== Получить координаты последней отрисовки фона. ============
628
======================================================================
629
======================================================================
629
Параметры:
630
Параметры:
630
  * eax = 15 - номер функции
631
  * eax = 15 - номер функции
631
  * ebx = 8 - номер подфункции
632
  * ebx = 8 - номер подфункции
632
Возвращаемое значение:
633
Возвращаемое значение:
633
  * eax = [left]*65536 + [right]
634
  * eax = [left]*65536 + [right]
634
  * ebx = [top]*65536 + [bottom]
635
  * ebx = [top]*65536 + [bottom]
635
Замечания:
636
Замечания:
636
  * (left,top) - координаты левого верхнего угла,
637
  * (left,top) - координаты левого верхнего угла,
637
    (right,bottom) - координаты правого нижнего.
638
    (right,bottom) - координаты правого нижнего.
638
  * Для получения более достоверных сведений, необходимо вызвать
639
  * Для получения более достоверных сведений, необходимо вызвать
639
    функцию сразу после получения события:
640
    функцию сразу после получения события:
640
             5 = завершилась перерисовка фона рабочего стола
641
             5 = завершилась перерисовка фона рабочего стола
641
 
642
 
642
======================================================================
643
======================================================================
643
====================== Функция 15, подфункция 9 ======================
644
====================== Функция 15, подфункция 9 ======================
644
=============== Перерисовать прямоугольную часть фона. ===============
645
=============== Перерисовать прямоугольную часть фона. ===============
645
======================================================================
646
======================================================================
646
Параметры:
647
Параметры:
647
  * eax = 15 - номер функции
648
  * eax = 15 - номер функции
648
  * ebx = 9 - номер подфункции
649
  * ebx = 9 - номер подфункции
649
  * ecx = [left]*65536 + [right]
650
  * ecx = [left]*65536 + [right]
650
  * edx = [top]*65536 + [bottom]
651
  * edx = [top]*65536 + [bottom]
651
Возвращаемое значение:
652
Возвращаемое значение:
652
  * функция не возвращает значения
653
  * функция не возвращает значения
653
Замечания:
654
Замечания:
654
  * (left,top) - координаты левого верхнего угла,
655
  * (left,top) - координаты левого верхнего угла,
655
    (right,bottom) - координаты правого нижнего.
656
    (right,bottom) - координаты правого нижнего.
656
  * Если параметры установлены некорректно - фон не перерисовывается.
657
  * Если параметры установлены некорректно - фон не перерисовывается.
657
 
658
 
658
======================================================================
659
======================================================================
659
============= Функция 16 - сохранить рамдиск на дискету. =============
660
============= Функция 16 - сохранить рамдиск на дискету. =============
660
======================================================================
661
======================================================================
661
Параметры:
662
Параметры:
662
  * eax = 16 - номер функции
663
  * eax = 16 - номер функции
663
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
664
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
664
Возвращаемое значение:
665
Возвращаемое значение:
665
  * eax = 0 - успешно
666
  * eax = 0 - успешно
666
  * eax = 1 - ошибка
667
  * eax = 1 - ошибка
667
 
668
 
668
======================================================================
669
======================================================================
669
============== Функция 17 - получить код нажатой кнопки. =============
670
============== Функция 17 - получить код нажатой кнопки. =============
670
======================================================================
671
======================================================================
671
Забирает код нажатой кнопки из буфера.
672
Забирает код нажатой кнопки из буфера.
672
Параметры:
673
Параметры:
673
  * eax = 17 - номер функции
674
  * eax = 17 - номер функции
674
Возвращаемое значение:
675
Возвращаемое значение:
675
  * если буфер пуст, возвращается eax=1
676
  * если буфер пуст, возвращается eax=1
676
  * если буфер непуст:
677
  * если буфер непуст:
677
    * старшие 24 бита eax содержат идентификатор кнопки
678
    * старшие 24 бита eax содержат идентификатор кнопки
678
      (в частности, в ah оказывается младший байт идентификатора;
679
      (в частности, в ah оказывается младший байт идентификатора;
679
      если все кнопки имеют идентификатор, меньший 256,
680
      если все кнопки имеют идентификатор, меньший 256,
680
      то для различения достаточно ah)
681
      то для различения достаточно ah)
681
    * al = 0 - кнопка была нажата левой кнопкой мыши
682
    * al = 0 - кнопка была нажата левой кнопкой мыши
682
    * al = бит, соответствующий нажавшей кнопке мыши, если не левой
683
    * al = бит, соответствующий нажавшей кнопке мыши, если не левой
683
Замечания:
684
Замечания:
684
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
685
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
685
    информация о старой теряется.
686
    информация о старой теряется.
686
  * При вызове этой функции приложением с неактивным окном
687
  * При вызове этой функции приложением с неактивным окном
687
    возвращается ответ "буфер пуст".
688
    возвращается ответ "буфер пуст".
688
  * Возвращаемое значение al соответствует состоянию кнопок мыши
689
  * Возвращаемое значение al соответствует состоянию кнопок мыши
689
    в формате подфункции 2 функции 37 в момент начала нажатия
690
    в формате подфункции 2 функции 37 в момент начала нажатия
690
    на кнопку, за исключением младшего бита (соответствующего левой
691
    на кнопку, за исключением младшего бита (соответствующего левой
691
    кнопке мыши), который сбрасывается.
692
    кнопке мыши), который сбрасывается.
692
======================================================================
693
======================================================================
693
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
694
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
694
======================================================================
695
======================================================================
695
Параметры:
696
Параметры:
696
  * eax = 18 - номер функции
697
  * eax = 18 - номер функции
697
  * ebx = 1 - номер подфункции
698
  * ebx = 1 - номер подфункции
698
  * ecx = номер слота потока
699
  * ecx = номер слота потока
699
Возвращаемое значение:
700
Возвращаемое значение:
700
  * функция не возвращает значения
701
  * функция не возвращает значения
701
 
702
 
702
======================================================================
703
======================================================================
703
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
704
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
704
======================================================================
705
======================================================================
705
Параметры:
706
Параметры:
706
  * eax = 18 - номер функции
707
  * eax = 18 - номер функции
707
  * ebx = 2 - номер подфункции
708
  * ebx = 2 - номер подфункции
708
  * ecx = номер слота процесса/потока
709
  * ecx = номер слота процесса/потока
709
Возвращаемое значение:
710
Возвращаемое значение:
710
  * функция не возвращает значения
711
  * функция не возвращает значения
711
Замечания:
712
Замечания:
712
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
713
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
713
    1), можно завершить любой обычный поток/процесс.
714
    1), можно завершить любой обычный поток/процесс.
714
  * Смотри также подфункцию 18 - завершение
715
  * Смотри также подфункцию 18 - завершение
715
    процесса/потока с заданным идентификатором.
716
    процесса/потока с заданным идентификатором.
716
 
717
 
717
======================================================================
718
======================================================================
718
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
719
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
719
======================================================================
720
======================================================================
720
Параметры:
721
Параметры:
721
  * eax = 18 - номер функции
722
  * eax = 18 - номер функции
722
  * ebx = 3 - номер подфункции
723
  * ebx = 3 - номер подфункции
723
  * ecx = номер слота потока
724
  * ecx = номер слота потока
724
Возвращаемое значение:
725
Возвращаемое значение:
725
  * функция не возвращает значения
726
  * функция не возвращает значения
726
Замечания:
727
Замечания:
727
  * При указании корректного, но несуществующего слота активизируется
728
  * При указании корректного, но несуществующего слота активизируется
728
    какое-то окно.
729
    какое-то окно.
729
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
730
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
730
 
731
 
731
======================================================================
732
======================================================================
732
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
733
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
733
======================================================================
734
======================================================================
734
Под пустыми тактами понимается время, в которое процессор простаивает
735
Под пустыми тактами понимается время, в которое процессор простаивает
735
в ожидании прерывания (в инструкции hlt).
736
в ожидании прерывания (в инструкции hlt).
736
 
737
 
737
Параметры:
738
Параметры:
738
  * eax = 18 - номер функции
739
  * eax = 18 - номер функции
739
  * ebx = 4 - номер подфункции
740
  * ebx = 4 - номер подфункции
740
Возвращаемое значение:
741
Возвращаемое значение:
741
  * eax = значение счётчика пустых тактов в секунду
742
  * eax = значение счётчика пустых тактов в секунду
742
 
743
 
743
======================================================================
744
======================================================================
744
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
745
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
745
======================================================================
746
======================================================================
746
Параметры:
747
Параметры:
747
  * eax = 18 - номер функции
748
  * eax = 18 - номер функции
748
  * ebx = 5 - номер подфункции
749
  * ebx = 5 - номер подфункции
749
Возвращаемое значение:
750
Возвращаемое значение:
750
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
751
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
751
 
752
 
752
======================================================================
753
======================================================================
753
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
754
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
754
======================================================================
755
======================================================================
755
Параметры:
756
Параметры:
756
  * eax = 18 - номер функции
757
  * eax = 18 - номер функции
757
  * ebx = 6 - номер подфункции
758
  * ebx = 6 - номер подфункции
758
  * ecx = указатель на строку с полным именем файла
759
  * ecx = указатель на строку с полным именем файла
759
    (например, "/hd0/1/kolibri/kolibri.img")
760
    (например, "/hd0/1/kolibri/kolibri.img")
760
Возвращаемое значение:
761
Возвращаемое значение:
761
  * eax = 0 - успешно
762
  * eax = 0 - успешно
762
  * иначе eax = код ошибки файловой системы
763
  * иначе eax = код ошибки файловой системы
763
Замечания:
764
Замечания:
764
  * Все папки в указанном пути должны существовать, иначе вернётся
765
  * Все папки в указанном пути должны существовать, иначе вернётся
765
    значение 5, "файл не найден".
766
    значение 5, "файл не найден".
766
 
767
 
767
======================================================================
768
======================================================================
768
====== Функция 18, подфункция 7 - получить номер активного окна. =====
769
====== Функция 18, подфункция 7 - получить номер активного окна. =====
769
======================================================================
770
======================================================================
770
Параметры:
771
Параметры:
771
  * eax = 18 - номер функции
772
  * eax = 18 - номер функции
772
  * ebx = 7 - номер подфункции
773
  * ebx = 7 - номер подфункции
773
Возвращаемое значение:
774
Возвращаемое значение:
774
  * eax = номер активного окна (номер слота потока, окно которого
775
  * eax = номер активного окна (номер слота потока, окно которого
775
    активно)
776
    активно)
776
Замечания:
777
Замечания:
777
  * Активное окно находится вверху оконного стэка и получает
778
  * Активное окно находится вверху оконного стэка и получает
778
    сообщения обо всём вводе с клавиатуры.
779
    сообщения обо всём вводе с клавиатуры.
779
  * Сделать окно активным можно вызовом подфункции 3.
780
  * Сделать окно активным можно вызовом подфункции 3.
780
 
781
 
781
======================================================================
782
======================================================================
782
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
783
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
783
======================================================================
784
======================================================================
784
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
785
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
785
При включённом - направляются на встроенный спикер.
786
При включённом - направляются на встроенный спикер.
786
 
787
 
787
--------------- Подподфункция 1 - получить состояние. ----------------
788
--------------- Подподфункция 1 - получить состояние. ----------------
788
Параметры:
789
Параметры:
789
  * eax = 18 - номер функции
790
  * eax = 18 - номер функции
790
  * ebx = 8 - номер подфункции
791
  * ebx = 8 - номер подфункции
791
  * ecx = 1 - номер подподфункции
792
  * ecx = 1 - номер подподфункции
792
Возвращаемое значение:
793
Возвращаемое значение:
793
  * eax = 0 - звук спикера разрешён; 1 - запрещён
794
  * eax = 0 - звук спикера разрешён; 1 - запрещён
794
 
795
 
795
-------------- Подподфункция 2 - переключить состояние. --------------
796
-------------- Подподфункция 2 - переключить состояние. --------------
796
Переключает состояния разрешения/запрещения.
797
Переключает состояния разрешения/запрещения.
797
Параметры:
798
Параметры:
798
  * eax = 18 - номер функции
799
  * eax = 18 - номер функции
799
  * ebx = 8 - номер подфункции
800
  * ebx = 8 - номер подфункции
800
  * ecx = 2 - номер подподфункции
801
  * ecx = 2 - номер подподфункции
801
Возвращаемое значение:
802
Возвращаемое значение:
802
  * функция не возвращает значения
803
  * функция не возвращает значения
803
 
804
 
804
======================================================================
805
======================================================================
805
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
806
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
806
======================================================================
807
======================================================================
807
Параметры:
808
Параметры:
808
  * eax = 18 - номер функции
809
  * eax = 18 - номер функции
809
  * ebx = 9 - номер подфункции
810
  * ebx = 9 - номер подфункции
810
  * ecx = параметр:
811
  * ecx = параметр:
811
    * 2 = выключить компьютер
812
    * 2 = выключить компьютер
812
    * 3 = перезагрузить компьютер
813
    * 3 = перезагрузить компьютер
813
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
814
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
814
Возвращаемое значение:
815
Возвращаемое значение:
815
  * при неверном ecx регистры не меняются (т.е. eax=18)
816
  * при неверном ecx регистры не меняются (т.е. eax=18)
816
  * при правильном вызове всегда возвращается признак успеха eax=0
817
  * при правильном вызове всегда возвращается признак успеха eax=0
817
Замечания:
818
Замечания:
818
  * Не следует полагаться на возвращаемое значение при неверном
819
  * Не следует полагаться на возвращаемое значение при неверном
819
    вызове, оно может измениться в последующих версиях ядра.
820
    вызове, оно может измениться в последующих версиях ядра.
820
 
821
 
821
======================================================================
822
======================================================================
822
========= Функция 18, подфункция 10 - свернуть активное окно. ========
823
========= Функция 18, подфункция 10 - свернуть активное окно. ========
823
======================================================================
824
======================================================================
824
Сворачивает активное окно.
825
Сворачивает активное окно.
825
Параметры:
826
Параметры:
826
  * eax = 18 - номер функции
827
  * eax = 18 - номер функции
827
  * ebx = 10 - номер подфункции
828
  * ebx = 10 - номер подфункции
828
Возвращаемое значение:
829
Возвращаемое значение:
829
  * функция не возвращает значения
830
  * функция не возвращает значения
830
Замечания:
831
Замечания:
831
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
832
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
832
    и размеры.
833
    и размеры.
833
  * Восстановление окна приложения происходит при активизировании
834
  * Восстановление окна приложения происходит при активизировании
834
    подфункцией 3.
835
    подфункцией 3.
835
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
836
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
836
    сворачивание окна осуществляется системой при нажатии на кнопку
837
    сворачивание окна осуществляется системой при нажатии на кнопку
837
    минимизации (которая для окон со скином определяется автоматически
838
    минимизации (которая для окон со скином определяется автоматически
838
    функцией 0, для окон без скина её можно определить функцией 8),
839
    функцией 0, для окон без скина её можно определить функцией 8),
839
    восстановление - приложением @taskbar.
840
    восстановление - приложением @taskbar.
840
 
841
 
841
======================================================================
842
======================================================================
842
====================== Функция 18, подфункция 11 =====================
843
====================== Функция 18, подфункция 11 =====================
843
============= Получить информацию о дисковой подсистеме. =============
844
============= Получить информацию о дисковой подсистеме. =============
844
======================================================================
845
======================================================================
845
Параметры:
846
Параметры:
846
  * eax = 18 - номер функции
847
  * eax = 18 - номер функции
847
  * ebx = 11 - номер подфункции
848
  * ebx = 11 - номер подфункции
848
  * ecx = тип таблицы:
849
  * ecx = тип таблицы:
849
    * 1 = короткая версия, 16 байт
850
    * 1 = короткая версия, 16 байт
850
  * edx = указатель на буфер (в приложении) для таблицы
851
  * edx = указатель на буфер (в приложении) для таблицы
851
Возвращаемое значение:
852
Возвращаемое значение:
852
  * функция не возвращает значения
853
  * функция не возвращает значения
853
Формат таблицы: короткая версия:
854
Формат таблицы: короткая версия:
854
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
855
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
855
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
856
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
856
    следующему списку:
857
    следующему списку:
857
    * 0 = нет дисковода
858
    * 0 = нет дисковода
858
    * 1 = 360Kb, 5.25''
859
    * 1 = 360Kb, 5.25''
859
    * 2 = 1.2Mb, 5.25''
860
    * 2 = 1.2Mb, 5.25''
860
    * 3 = 720Kb, 3.5''
861
    * 3 = 720Kb, 3.5''
861
    * 4 = 1.44Mb, 3.5''
862
    * 4 = 1.44Mb, 3.5''
862
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
863
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
863
    Например, для стандартной конфигурации из одного 1.44-дисковода
864
    Например, для стандартной конфигурации из одного 1.44-дисковода
864
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
865
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
865
    значение оказывается 24h.
866
    значение оказывается 24h.
866
 
867
 
867
  Первый контроллер IDE:
868
  Первый контроллер IDE:
868
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
869
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
869
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
870
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
870
    * 0 = устройство отсутствует
871
    * 0 = устройство отсутствует
871
    * 1 = жёсткий диск
872
    * 1 = жёсткий диск
872
    * 2 = CD-привод
873
    * 2 = CD-привод
873
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
874
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
874
  * +2: 4 db: число найденных разделов на жёстких дисках с
875
  * +2: 4 db: число найденных разделов на жёстких дисках с
875
    соответственно IDE0,...,IDE3.
876
    соответственно IDE0,...,IDE3.
876
 
877
 
877
  Второй контроллер IDE:
878
  Второй контроллер IDE:
878
  * +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
879
  * +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
879
    где AA соответствует контроллеру IDE4, ..., DD - IDE7:
880
    где AA соответствует контроллеру IDE4, ..., DD - IDE7:
880
    * 0 = устройство отсутствует
881
    * 0 = устройство отсутствует
881
    * 1 = жёсткий диск
882
    * 1 = жёсткий диск
882
    * 2 = CD-привод
883
    * 2 = CD-привод
883
    Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
884
    Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
884
  * +7: 4 db: число найденных разделов на жёстких дисках с
885
  * +7: 4 db: число найденных разделов на жёстких дисках с
885
    соответственно IDE4,...,IDE7.
886
    соответственно IDE4,...,IDE7.
886
 
887
 
887
  Третий контроллер IDE:
888
  Третий контроллер IDE:
888
  * +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
889
  * +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
889
    где AA соответствует контроллеру IDE8, ..., DD - IDE11:
890
    где AA соответствует контроллеру IDE8, ..., DD - IDE11:
890
    * 0 = устройство отсутствует
891
    * 0 = устройство отсутствует
891
    * 1 = жёсткий диск
892
    * 1 = жёсткий диск
892
    * 2 = CD-привод
893
    * 2 = CD-привод
893
    Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
894
    Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
894
  * +12: 4 db: число найденных разделов на жёстких дисках с
895
  * +12: 4 db: число найденных разделов на жёстких дисках с
895
    соответственно IDE8,...,IDE11.
896
    соответственно IDE8,...,IDE11.
896
 
897
 
897
    При отсутствии жёсткого диска на IDEx соответствующий байт
898
    При отсутствии жёсткого диска на IDEx соответствующий байт
898
    нулевой, при наличии показывает число распознанных разделов,
899
    нулевой, при наличии показывает число распознанных разделов,
899
    которых может и не быть (если носитель не отформатирован или
900
    которых может и не быть (если носитель не отформатирован или
900
    если файловая система не поддерживается). В текущей версии ядра
901
    если файловая система не поддерживается). В текущей версии ядра
901
    для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
902
    для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
902
    ext2/3/4 и XFS.
903
    ext2/3/4 и XFS.
903
 
904
 
904
Замечания:
905
Замечания:
905
  * Таблица может быть использована для получения информации
906
  * Таблица может быть использована для получения информации
906
    об имеющихся устройствах.
907
    об имеющихся устройствах.
907
 
908
 
908
======================================================================
909
======================================================================
909
========== Функция 18, подфункция 13 - получить версию ядра. =========
910
========== Функция 18, подфункция 13 - получить версию ядра. =========
910
======================================================================
911
======================================================================
911
Параметры:
912
Параметры:
912
  * eax = 18 - номер функции
913
  * eax = 18 - номер функции
913
  * ebx = 13 - номер подфункции
914
  * ebx = 13 - номер подфункции
914
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
915
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
915
    информация
916
    информация
916
Возвращаемое значение:
917
Возвращаемое значение:
917
  * функция не возвращает значения
918
  * функция не возвращает значения
918
Структура буфера:
919
Структура буфера:
919
db a,b,c,d для версии a.b.c.d
920
db a,b,c,d для версии a.b.c.d
920
db 0: зарезервировано
921
db 0: зарезервировано
921
dd REV - номер svn-ревизии ядра
922
dd REV - номер svn-ревизии ядра
922
Для ядра Kolibri 0.7.7.0+:
923
Для ядра Kolibri 0.7.7.0+:
923
db 0,7,7,0
924
db 0,7,7,0
924
db 0
925
db 0
925
dd 1675
926
dd 1675
926
 
927
 
927
======================================================================
928
======================================================================
928
====================== Функция 18, подфункция 14 =====================
929
====================== Функция 18, подфункция 14 =====================
929
======= Ожидать начала обратного хода луча развёртки монитора. =======
930
======= Ожидать начала обратного хода луча развёртки монитора. =======
930
======================================================================
931
======================================================================
931
Параметры:
932
Параметры:
932
  * eax = 18 - номер функции
933
  * eax = 18 - номер функции
933
  * ebx = 14 - номер подфункции
934
  * ebx = 14 - номер подфункции
934
Возвращаемое значение:
935
Возвращаемое значение:
935
  * eax = 0 как признак успеха
936
  * eax = 0 как признак успеха
936
Замечания:
937
Замечания:
937
  * Функция предназначена исключительно для активных
938
  * Функция предназначена исключительно для активных
938
    высокопроизводительных графических приложений; используется для
939
    высокопроизводительных графических приложений; используется для
939
    плавного вывода графики.
940
    плавного вывода графики.
940
 
941
 
941
======================================================================
942
======================================================================
942
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
943
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
943
======================================================================
944
======================================================================
944
Параметры:
945
Параметры:
945
  * eax = 18 - номер функции
946
  * eax = 18 - номер функции
946
  * ebx = 15 - номер подфункции
947
  * ebx = 15 - номер подфункции
947
Возвращаемое значение:
948
Возвращаемое значение:
948
  * eax = 0 как признак успеха
949
  * eax = 0 как признак успеха
949
 
950
 
950
======================================================================
951
======================================================================
951
====================== Функция 18, подфункция 16 =====================
952
====================== Функция 18, подфункция 16 =====================
952
============ Получить размер свободной оперативной памяти. ===========
953
============ Получить размер свободной оперативной памяти. ===========
953
======================================================================
954
======================================================================
954
Параметры:
955
Параметры:
955
  * eax = 18 - номер функции
956
  * eax = 18 - номер функции
956
  * ebx = 16 - номер подфункции
957
  * ebx = 16 - номер подфункции
957
Возвращаемое значение:
958
Возвращаемое значение:
958
  * eax = размер свободной памяти в килобайтах
959
  * eax = размер свободной памяти в килобайтах
959
 
960
 
960
======================================================================
961
======================================================================
961
====================== Функция 18, подфункция 17 =====================
962
====================== Функция 18, подфункция 17 =====================
962
============ Получить размер имеющейся оперативной памяти. ===========
963
============ Получить размер имеющейся оперативной памяти. ===========
963
======================================================================
964
======================================================================
964
Параметры:
965
Параметры:
965
  * eax = 18 - номер функции
966
  * eax = 18 - номер функции
966
  * ebx = 17 - номер подфункции
967
  * ebx = 17 - номер подфункции
967
Возвращаемое значение:
968
Возвращаемое значение:
968
  * eax = общий размер имеющейся памяти в килобайтах
969
  * eax = общий размер имеющейся памяти в килобайтах
969
 
970
 
970
======================================================================
971
======================================================================
971
====================== Функция 18, подфункция 18 =====================
972
====================== Функция 18, подфункция 18 =====================
972
============= Завершить процесс/поток по идентификатору. =============
973
============= Завершить процесс/поток по идентификатору. =============
973
======================================================================
974
======================================================================
974
Параметры:
975
Параметры:
975
  * eax = 18 - номер функции
976
  * eax = 18 - номер функции
976
  * ebx = 18 - номер подфункции
977
  * ebx = 18 - номер подфункции
977
  * ecx = идентификатор процесса/потока (PID/TID)
978
  * ecx = идентификатор процесса/потока (PID/TID)
978
Возвращаемое значение:
979
Возвращаемое значение:
979
  * eax = 0 - успешно
980
  * eax = 0 - успешно
980
  * eax = -1 - ошибка (процесс не найден или является системным)
981
  * eax = -1 - ошибка (процесс не найден или является системным)
981
Замечания:
982
Замечания:
982
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
983
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
983
    1), можно завершить любой обычный поток/процесс.
984
    1), можно завершить любой обычный поток/процесс.
984
  * Смотри также подфункцию 2 - завершение
985
  * Смотри также подфункцию 2 - завершение
985
    процесса/потока по заданному слоту.
986
    процесса/потока по заданному слоту.
986
 
987
 
987
======================================================================
988
======================================================================
988
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
989
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
989
======================================================================
990
======================================================================
990
 
991
 
991
------------- Подподфункция 0 - получить скорость мыши. --------------
992
------------- Подподфункция 0 - получить скорость мыши. --------------
992
Параметры:
993
Параметры:
993
  * eax = 18 - номер функции
994
  * eax = 18 - номер функции
994
  * ebx = 19 - номер подфункции
995
  * ebx = 19 - номер подфункции
995
  * ecx = 0 - номер подподфункции
996
  * ecx = 0 - номер подподфункции
996
Возвращаемое значение:
997
Возвращаемое значение:
997
  * eax = текущая скорость мыши
998
  * eax = текущая скорость мыши
998
 
999
 
999
------------ Подподфункция 1 - установить скорость мыши. -------------
1000
------------ Подподфункция 1 - установить скорость мыши. -------------
1000
Параметры:
1001
Параметры:
1001
  * eax = 18 - номер функции
1002
  * eax = 18 - номер функции
1002
  * ebx = 19 - номер подфункции
1003
  * ebx = 19 - номер подфункции
1003
  * ecx = 1 - номер подподфункции
1004
  * ecx = 1 - номер подподфункции
1004
  * edx = новое значение скорости
1005
  * edx = новое значение скорости
1005
Возвращаемое значение:
1006
Возвращаемое значение:
1006
  * функция не возвращает значения
1007
  * функция не возвращает значения
1007
 
1008
 
1008
------------- Подподфункция 2 - получить задержку мыши. --------------
1009
------------- Подподфункция 2 - получить задержку мыши. --------------
1009
Параметры:
1010
Параметры:
1010
  * eax = 18 - номер функции
1011
  * eax = 18 - номер функции
1011
  * ebx = 19 - номер подфункции
1012
  * ebx = 19 - номер подфункции
1012
  * ecx = 2 - номер подподфункции
1013
  * ecx = 2 - номер подподфункции
1013
Возвращаемое значение:
1014
Возвращаемое значение:
1014
  * eax = текущая задержка мыши
1015
  * eax = текущая задержка мыши
1015
 
1016
 
1016
------------ Подподфункция 3 - установить задержку мыши. -------------
1017
------------ Подподфункция 3 - установить задержку мыши. -------------
1017
Параметры:
1018
Параметры:
1018
  * eax = 18 - номер функции
1019
  * eax = 18 - номер функции
1019
  * ebx = 19 - номер подфункции
1020
  * ebx = 19 - номер подфункции
1020
  * ecx = 3 - номер подподфункции
1021
  * ecx = 3 - номер подподфункции
1021
  * edx = новое значение задержки мыши
1022
  * edx = новое значение задержки мыши
1022
Возвращаемое значение:
1023
Возвращаемое значение:
1023
  * функция не возвращает значения
1024
  * функция не возвращает значения
1024
 
1025
 
1025
-------- Подподфункция 4 - установить положение курсора мыши. --------
1026
-------- Подподфункция 4 - установить положение курсора мыши. --------
1026
Параметры:
1027
Параметры:
1027
  * eax = 18 - номер функции
1028
  * eax = 18 - номер функции
1028
  * ebx = 19 - номер подфункции
1029
  * ebx = 19 - номер подфункции
1029
  * ecx = 4 - номер подподфункции
1030
  * ecx = 4 - номер подподфункции
1030
  * edx = [координата по оси x]*65536 + [координата по оси y]
1031
  * edx = [координата по оси x]*65536 + [координата по оси y]
1031
Возвращаемое значение:
1032
Возвращаемое значение:
1032
  * функция не возвращает значения
1033
  * функция не возвращает значения
1033
 
1034
 
1034
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
1035
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
1035
Параметры:
1036
Параметры:
1036
  * eax = 18 - номер функции
1037
  * eax = 18 - номер функции
1037
  * ebx = 19 - номер подфункции
1038
  * ebx = 19 - номер подфункции
1038
  * ecx = 5 - номер подподфункции
1039
  * ecx = 5 - номер подподфункции
1039
  * edx = информация о эмулируемом состоянии кнопок мыши:
1040
  * edx = информация о эмулируемом состоянии кнопок мыши:
1040
    (соответствует возвращаемому значению подфункции 2 функции 37)
1041
    (соответствует возвращаемому значению подфункции 2 функции 37)
1041
    * бит 0 установлен = левая кнопка нажата
1042
    * бит 0 установлен = левая кнопка нажата
1042
    * бит 1 установлен = правая кнопка нажата
1043
    * бит 1 установлен = правая кнопка нажата
1043
    * бит 2 установлен = средняя кнопка нажата
1044
    * бит 2 установлен = средняя кнопка нажата
1044
    * бит 3 установлен = 4-я кнопка нажата
1045
    * бит 3 установлен = 4-я кнопка нажата
1045
    * бит 4 установлен = 5-я кнопка нажата
1046
    * бит 4 установлен = 5-я кнопка нажата
1046
Возвращаемое значение:
1047
Возвращаемое значение:
1047
  * функция не возвращает значения
1048
  * функция не возвращает значения
1048
 
1049
 
1049
-------- Подподфункция 6 - получить задержку двойного щелчка. --------
1050
-------- Подподфункция 6 - получить задержку двойного щелчка. --------
1050
Параметры:
1051
Параметры:
1051
  * eax = 18 - номер функции
1052
  * eax = 18 - номер функции
1052
  * ebx = 19 - номер подфункции
1053
  * ebx = 19 - номер подфункции
1053
  * ecx = 6 - номер подподфункции
1054
  * ecx = 6 - номер подподфункции
1054
Возвращаемое значение:
1055
Возвращаемое значение:
1055
  * eax = текущая задержка двойного щелчка (100 = секунда)
1056
  * eax = текущая задержка двойного щелчка (100 = секунда)
1056
 
1057
 
1057
------- Подподфункция 7 - установить задержку двойного щелчка. -------
1058
------- Подподфункция 7 - установить задержку двойного щелчка. -------
1058
Параметры:
1059
Параметры:
1059
  * eax = 18 - номер функции
1060
  * eax = 18 - номер функции
1060
  * ebx = 19 - номер подфункции
1061
  * ebx = 19 - номер подфункции
1061
  * ecx = 7 - номер подподфункции
1062
  * ecx = 7 - номер подподфункции
1062
  * dl  = новое значение задержки двойного щелчка (100 = секунда)
1063
  * dl  = новое значение задержки двойного щелчка (100 = секунда)
1063
Возвращаемое значение:
1064
Возвращаемое значение:
1064
  * функция не возвращает значения
1065
  * функция не возвращает значения
1065
 
1066
 
1066
Замечания:
1067
Замечания:
1067
  * Рекомендуемая скорость мыши (в подподфункции 1) от 1 до 9.
1068
  * Рекомендуемая скорость мыши (в подподфункции 1) от 1 до 9.
1068
    Устанавливаемая величина не проверяется кодом ядра, поэтому
1069
    Устанавливаемая величина не проверяется кодом ядра, поэтому
1069
    используйте осторожно, при некорректном значении курсор может
1070
    используйте осторожно, при некорректном значении курсор может
1070
    "замёрзнуть". Скорость мыши можно регулировать в приложении SETUP.
1071
    "замёрзнуть". Скорость мыши можно регулировать в приложении SETUP.
1071
  * Рекомендуемая величина задержки (в подподфункции 3) = 10.
1072
  * Рекомендуемая величина задержки (в подподфункции 3) = 10.
1072
    Меньшие значения не обрабатываются COM-мышами. При очень больших
1073
    Меньшие значения не обрабатываются COM-мышами. При очень больших
1073
    значениях невозможно передвижение мыши на 1 пиксель и курсор будет
1074
    значениях невозможно передвижение мыши на 1 пиксель и курсор будет
1074
    прыгать на величину установленной скорости (подподфункция 1).
1075
    прыгать на величину установленной скорости (подподфункция 1).
1075
    Устанавливаемая величина не проверяется кодом ядра.
1076
    Устанавливаемая величина не проверяется кодом ядра.
1076
    Величину задержки можно менять в приложении SETUP.
1077
    Величину задержки можно менять в приложении SETUP.
1077
  * Подподфункция 4 не проверяет переданное значение. Перед вызовом
1078
  * Подподфункция 4 не проверяет переданное значение. Перед вызовом
1078
    необходимо узнать текущее разрешение экрана (подфункцией 14)
1079
    необходимо узнать текущее разрешение экрана (подфункцией 14)
1079
    и проверить, что устанавливаемое положение не выходит за пределы
1080
    и проверить, что устанавливаемое положение не выходит за пределы
1080
    экрана.
1081
    экрана.
1081
 
1082
 
1082
======================================================================
1083
======================================================================
1083
====================== Функция 18, подфункция 20 =====================
1084
====================== Функция 18, подфункция 20 =====================
1084
============= Получить информацию об оперативной памяти. =============
1085
============= Получить информацию об оперативной памяти. =============
1085
======================================================================
1086
======================================================================
1086
Параметры:
1087
Параметры:
1087
  * eax = 18 - номер функции
1088
  * eax = 18 - номер функции
1088
  * ebx = 20 - номер подфункции
1089
  * ebx = 20 - номер подфункции
1089
  * ecx = указатель на буфер для информации (36 байт)
1090
  * ecx = указатель на буфер для информации (36 байт)
1090
Возвращаемое значение:
1091
Возвращаемое значение:
1091
  * eax = общий размер имеющейся оперативной памяти в байтах
1092
  * eax = общий размер имеющейся оперативной памяти в байтах
1092
    или -1 в случае ошибки
1093
    или -1 в случае ошибки
1093
  * буфер, на который указывает ecx, содержит следующую информацию:
1094
  * буфер, на который указывает ecx, содержит следующую информацию:
1094
    * +0: dword: общий размер имеющейся оперативной памяти в страницах
1095
    * +0: dword: общий размер имеющейся оперативной памяти в страницах
1095
    * +4:  dword: размер свободной оперативной памяти в страницах
1096
    * +4:  dword: размер свободной оперативной памяти в страницах
1096
    * +8:  dword: число страничных ошибок (исключений #PF)
1097
    * +8:  dword: число страничных ошибок (исключений #PF)
1097
                 в приложениях
1098
                 в приложениях
1098
    * +12: dword: размер кучи ядра в байтах
1099
    * +12: dword: размер кучи ядра в байтах
1099
    * +16: dword: размер свободной памяти в куче ядра в байтах
1100
    * +16: dword: размер свободной памяти в куче ядра в байтах
1100
    * +20: dword: общее количество блоков памяти в куче ядра
1101
    * +20: dword: общее количество блоков памяти в куче ядра
1101
    * +24: dword: количество свободных блоков памяти в куче ядра
1102
    * +24: dword: количество свободных блоков памяти в куче ядра
1102
    * +28: dword: размер наибольшего свободного блока в куче ядра
1103
    * +28: dword: размер наибольшего свободного блока в куче ядра
1103
                 (зарезервировано)
1104
                 (зарезервировано)
1104
    * +32: dword: размер наибольшего выделенного блока в куче ядра
1105
    * +32: dword: размер наибольшего выделенного блока в куче ядра
1105
                 (зарезервировано)
1106
                 (зарезервировано)
1106
 
1107
 
1107
======================================================================
1108
======================================================================
1108
====================== Функция 18, подфункция 21 =====================
1109
====================== Функция 18, подфункция 21 =====================
1109
======= Получить номер слота процесса/потока по идентификатору. ======
1110
======= Получить номер слота процесса/потока по идентификатору. ======
1110
======================================================================
1111
======================================================================
1111
Параметры:
1112
Параметры:
1112
  * eax = 18 - номер функции
1113
  * eax = 18 - номер функции
1113
  * ebx = 21 - номер подфункции
1114
  * ebx = 21 - номер подфункции
1114
  * ecx = идентификатор процесса/потока (PID/TID)
1115
  * ecx = идентификатор процесса/потока (PID/TID)
1115
Возвращаемое значение:
1116
Возвращаемое значение:
1116
  * eax = 0 - ошибка (неверный идентификатор)
1117
  * eax = 0 - ошибка (неверный идентификатор)
1117
  * иначе eax = номер слота
1118
  * иначе eax = номер слота
1118
 
1119
 
1119
======================================================================
1120
======================================================================
1120
 Функция 18, подфункция 22 - операции с окном другого процесса/потока.
1121
 Функция 18, подфункция 22 - операции с окном другого процесса/потока.
1121
======================================================================
1122
======================================================================
1122
Параметры:
1123
Параметры:
1123
  * eax = 18 - номер функции
1124
  * eax = 18 - номер функции
1124
  * ebx = 22 - номер подфункции
1125
  * ebx = 22 - номер подфункции
1125
  * ecx = тип операции:
1126
  * ecx = тип операции:
1126
    * 0 = минимизация окна, поток задан номером слота
1127
    * 0 = минимизация окна, поток задан номером слота
1127
    * 1 = минимизация окна, поток задан идентификатором
1128
    * 1 = минимизация окна, поток задан идентификатором
1128
    * 2 = восстановление окна, поток задан номером слота
1129
    * 2 = восстановление окна, поток задан номером слота
1129
    * 3 = восстановление окна, поток задан идентификатором
1130
    * 3 = восстановление окна, поток задан идентификатором
1130
  * edx = параметр операции (номер слота или PID/TID)
1131
  * edx = параметр операции (номер слота или PID/TID)
1131
Возвращаемое значение:
1132
Возвращаемое значение:
1132
  * eax = 0 - успешно
1133
  * eax = 0 - успешно
1133
  * eax = -1 - ошибка (неправильный параметр)
1134
  * eax = -1 - ошибка (неправильный параметр)
1134
Замечания:
1135
Замечания:
1135
  * Поток может свернуть своё окно вызовом подфункции 10.
1136
  * Поток может свернуть своё окно вызовом подфункции 10.
1136
  * Восстановление окна с одновременной активизацией осуществляется
1137
  * Восстановление окна с одновременной активизацией осуществляется
1137
    подфункции 3 (принимающей номер слота).
1138
    подфункции 3 (принимающей номер слота).
1138
 
1139
 
1139
======================================================================
1140
======================================================================
1140
======= Функция 18, подфункция 23 - минимизировать все окна. =========
1141
======= Функция 18, подфункция 23 - минимизировать все окна. =========
1141
======================================================================
1142
======================================================================
1142
Параметры:
1143
Параметры:
1143
  * eax = 18 - номер функции
1144
  * eax = 18 - номер функции
1144
  * ebx = 23 - номер подфункции
1145
  * ebx = 23 - номер подфункции
1145
Возвращаемое значение:
1146
Возвращаемое значение:
1146
  * eax = 0 - все окна были минимизированы до вызова функции
1147
  * eax = 0 - все окна были минимизированы до вызова функции
1147
  * eax = N - количество окон свернутых функцией
1148
  * eax = N - количество окон свернутых функцией
1148
Замечания:
1149
Замечания:
1149
  * Окна спец. потоков (имя начинается с символа @) не сворачиваются.
1150
  * Окна спец. потоков (имя начинается с символа @) не сворачиваются.
1150
 
1151
 
1151
======================================================================
1152
======================================================================
1152
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
1153
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
1153
======================================================================
1154
======================================================================
1154
Параметры:
1155
Параметры:
1155
  * eax = 18 - номер функции
1156
  * eax = 18 - номер функции
1156
  * ebx = 24 - номер подфункции
1157
  * ebx = 24 - номер подфункции
1157
  * ecx = новый размер по X
1158
  * ecx = новый размер по X
1158
  * edx = новый размер по Y
1159
  * edx = новый размер по Y
1159
Возвращаемое значение:
1160
Возвращаемое значение:
1160
  * функция не возвращает значения
1161
  * функция не возвращает значения
1161
Замечания:
1162
Замечания:
1162
  * Функция не меняет физический размер видеорежима. Она предназначена
1163
  * Функция не меняет физический размер видеорежима. Она предназначена
1163
    для нестандартных дисплеев, отображающих изображение частично.
1164
    для нестандартных дисплеев, отображающих изображение частично.
1164
  * Размеры указываемые в функции не должны превышать размеры текущего
1165
  * Размеры указываемые в функции не должны превышать размеры текущего
1165
    видеорежима, иначе функция ничего не изменит.
1166
    видеорежима, иначе функция ничего не изменит.
1166
 
1167
 
1167
======================================================================
1168
======================================================================
1168
===================== Функция 18, подфункция 25 ======================
1169
===================== Функция 18, подфункция 25 ======================
1169
======== Управление положением окна относительно других окон. ========
1170
======== Управление положением окна относительно других окон. ========
1170
======================================================================
1171
======================================================================
1171
 
1172
 
1172
------------- Подподфункция 1 - получить положение  ------------------
1173
------------- Подподфункция 1 - получить положение  ------------------
1173
Параметры:
1174
Параметры:
1174
  * eax = 18 - номер функции
1175
  * eax = 18 - номер функции
1175
  * ebx = 25 - номер подфункции
1176
  * ebx = 25 - номер подфункции
1176
  * ecx = 1 - номер подподфункции
1177
  * ecx = 1 - номер подподфункции
1177
  * edx = -1(для текущего окна) или PID приложения
1178
  * edx = -1(для текущего окна) или PID приложения
1178
Возвращаемое значение:
1179
Возвращаемое значение:
1179
  * eax = одна из констант положения окна
1180
  * eax = одна из констант положения окна
1180
 
1181
 
1181
------------- Подподфункция 2 - установить положение  ----------------
1182
------------- Подподфункция 2 - установить положение  ----------------
1182
Параметры:
1183
Параметры:
1183
  * eax = 18 - номер функции
1184
  * eax = 18 - номер функции
1184
  * ebx = 25 - номер подфункции
1185
  * ebx = 25 - номер подфункции
1185
  * ecx = 2 - номер подподфункции
1186
  * ecx = 2 - номер подподфункции
1186
  * edx = -1(для текущего окна) или PID приложения
1187
  * edx = -1(для текущего окна) или PID приложения
1187
  * esi = новое положение окна (одна из констант ниже)
1188
  * esi = новое положение окна (одна из констант ниже)
1188
Возвращаемое значение:
1189
Возвращаемое значение:
1189
  * eax = 0 - неудача
1190
  * eax = 0 - неудача
1190
  * eax = 1 - успех
1191
  * eax = 1 - успех
1191
 
1192
 
1192
Константы положения окна относительно других окон:
1193
Константы положения окна относительно других окон:
1193
 ZPOS_DESKTOP     = -2 - на самом заднем плане 
1194
 ZPOS_DESKTOP     = -2 - на самом заднем плане 
1194
 ZPOS_ALWAYS_BACK = -1 - позади всех окон
1195
 ZPOS_ALWAYS_BACK = -1 - позади всех окон
1195
 ZPOS_NORMAL      = 0  - обычное
1196
 ZPOS_NORMAL      = 0  - обычное
1196
 ZPOS_ALWAYS_TOP  = 1  - поверх всех окон
1197
 ZPOS_ALWAYS_TOP  = 1  - поверх всех окон
1197
 
1198
 
1198
======================================================================
1199
======================================================================
1199
==================== Функция 20 - интерфейс MIDI. ====================
1200
==================== Функция 20 - интерфейс MIDI. ====================
1200
======================================================================
1201
======================================================================
1201
 
1202
 
1202
------------------------ Подфункция 1 - сброс ------------------------
1203
------------------------ Подфункция 1 - сброс ------------------------
1203
Параметры:
1204
Параметры:
1204
  * eax = 20 - номер функции
1205
  * eax = 20 - номер функции
1205
  * ebx = 1 - номер подфункции
1206
  * ebx = 1 - номер подфункции
1206
 
1207
 
1207
-------------------- Подфункция 2 - вывести байт ---------------------
1208
-------------------- Подфункция 2 - вывести байт ---------------------
1208
Параметры:
1209
Параметры:
1209
  * eax = 20 - номер функции
1210
  * eax = 20 - номер функции
1210
  * ebx = 2 - номер подфункции
1211
  * ebx = 2 - номер подфункции
1211
  * cl = байт для вывода
1212
  * cl = байт для вывода
1212
Возвращаемое значение (одинаково для обеих подфункций):
1213
Возвращаемое значение (одинаково для обеих подфункций):
1213
  * eax = 0 - успешно
1214
  * eax = 0 - успешно
1214
  * eax = 1 - не определён базовый порт
1215
  * eax = 1 - не определён базовый порт
1215
Замечания:
1216
Замечания:
1216
  * Предварительно должен быть определён базовый порт вызовом
1217
  * Предварительно должен быть определён базовый порт вызовом
1217
    подфункции 1 функции 21.
1218
    подфункции 1 функции 21.
1218
 
1219
 
1219
======================================================================
1220
======================================================================
1220
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
1221
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
1221
======================================================================
1222
======================================================================
1222
Параметры:
1223
Параметры:
1223
  * eax = 21 - номер функции
1224
  * eax = 21 - номер функции
1224
  * ebx = 1 - номер подфункции
1225
  * ebx = 1 - номер подфункции
1225
  * ecx = номер базового порта
1226
  * ecx = номер базового порта
1226
Возвращаемое значение:
1227
Возвращаемое значение:
1227
  * eax = 0 - успешно
1228
  * eax = 0 - успешно
1228
  * eax = -1 - ошибочный номер порта
1229
  * eax = -1 - ошибочный номер порта
1229
Замечания:
1230
Замечания:
1230
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1231
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1231
  * Установка базы нужна для работы функции 20.
1232
  * Установка базы нужна для работы функции 20.
1232
  * Получить установленный базовый порт можно вызовом
1233
  * Получить установленный базовый порт можно вызовом
1233
    подфункции 1 функции 26.
1234
    подфункции 1 функции 26.
1234
 
1235
 
1235
======================================================================
1236
======================================================================
1236
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
1237
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
1237
======================================================================
1238
======================================================================
1238
Раскладка клавиатуры используется для преобразования сканкодов,
1239
Раскладка клавиатуры используется для преобразования сканкодов,
1239
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1240
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1240
Параметры:
1241
Параметры:
1241
  * eax = 21 - номер функции
1242
  * eax = 21 - номер функции
1242
  * ebx = 2 - номер подфункции
1243
  * ebx = 2 - номер подфункции
1243
  * ecx = какую раскладку устанавливать:
1244
  * ecx = какую раскладку устанавливать:
1244
    * 1 = нормальную
1245
    * 1 = нормальную
1245
    * 2 = раскладку при нажатом Shift
1246
    * 2 = раскладку при нажатом Shift
1246
    * 3 = раскладку при нажатом Alt
1247
    * 3 = раскладку при нажатом Alt
1247
  * edx = указатель на раскладку - таблицу длиной 128 байт
1248
  * edx = указатель на раскладку - таблицу длиной 128 байт
1248
Или:
1249
Или:
1249
  * ecx = 9
1250
  * ecx = 9
1250
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1251
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1251
Возвращаемое значение:
1252
Возвращаемое значение:
1252
  * eax = 0 - успешно
1253
  * eax = 0 - успешно
1253
  * eax = 1 - параметр задан неверно
1254
  * eax = 1 - параметр задан неверно
1254
Замечания:
1255
Замечания:
1255
  * Если нажат Alt, то используется раскладка с Alt;
1256
  * Если нажат Alt, то используется раскладка с Alt;
1256
    если не нажат Alt, но нажат Shift, то
1257
    если не нажат Alt, но нажат Shift, то
1257
    используется раскладка с Shift;
1258
    используется раскладка с Shift;
1258
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1259
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1259
    нормальная раскладка, после чего из кода вычитается 0x60;
1260
    нормальная раскладка, после чего из кода вычитается 0x60;
1260
    если не нажата ни одна из управляющих клавиш, то используется
1261
    если не нажата ни одна из управляющих клавиш, то используется
1261
    нормальная раскладка.
1262
    нормальная раскладка.
1262
  * Получить раскладки и идентификатор страны можно с помощью
1263
  * Получить раскладки и идентификатор страны можно с помощью
1263
    подфункции 2 функции 26.
1264
    подфункции 2 функции 26.
1264
  * Идентификатор страны - глобальная системная переменная, которая
1265
  * Идентификатор страны - глобальная системная переменная, которая
1265
    самим ядром не используется; однако приложение @taskbar отображает
1266
    самим ядром не используется; однако приложение @taskbar отображает
1266
    соответствующую текущей стране иконку.
1267
    соответствующую текущей стране иконку.
1267
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1268
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1268
 
1269
 
1269
======================================================================
1270
======================================================================
1270
========= Функция 21, подфункция 5 - установить язык системы. ========
1271
========= Функция 21, подфункция 5 - установить язык системы. ========
1271
======================================================================
1272
======================================================================
1272
Параметры:
1273
Параметры:
1273
  * eax = 21 - номер функции
1274
  * eax = 21 - номер функции
1274
  * ebx = 5 - номер подфункции
1275
  * ebx = 5 - номер подфункции
1275
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1276
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1276
Возвращаемое значение:
1277
Возвращаемое значение:
1277
  * eax = 0
1278
  * eax = 0
1278
Замечания:
1279
Замечания:
1279
  * Язык системы - глобальная системная переменная, никак
1280
  * Язык системы - глобальная системная переменная, никак
1280
    не используемая самим ядром, однако приложение @taskbar рисует
1281
    не используемая самим ядром, однако приложение @taskbar рисует
1281
    соответствующую иконку.
1282
    соответствующую иконку.
1282
  * Проверок на корректность не делается, поскольку ядро эту
1283
  * Проверок на корректность не делается, поскольку ядро эту
1283
    переменную не использует.
1284
    переменную не использует.
1284
  * Получить язык системы можно вызовом подфункции 5 функции 26.
1285
  * Получить язык системы можно вызовом подфункции 5 функции 26.
1285
 
1286
 
1286
======================================================================
1287
======================================================================
1287
====================== Функция 21, подфункция 11 =====================
1288
====================== Функция 21, подфункция 11 =====================
1288
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1289
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1289
======================================================================
1290
======================================================================
1290
Параметры:
1291
Параметры:
1291
  * eax = 21 - номер функции
1292
  * eax = 21 - номер функции
1292
  * ebx = 11 - номер подфункции
1293
  * ebx = 11 - номер подфункции
1293
  * ecx = 0/1 - запретить/разрешить
1294
  * ecx = 0/1 - запретить/разрешить
1294
Возвращаемое значение:
1295
Возвращаемое значение:
1295
  * eax = 0
1296
  * eax = 0
1296
Замечания:
1297
Замечания:
1297
  * Используется при LBA-чтении (подфункция 8 функции 58).
1298
  * Используется при LBA-чтении (подфункция 8 функции 58).
1298
  * Текущая реализация использует только младший бит ecx.
1299
  * Текущая реализация использует только младший бит ecx.
1299
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
1300
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
1300
 
1301
 
1301
======================================================================
1302
======================================================================
1302
====================== Функция 21, подфункция 12 =====================
1303
====================== Функция 21, подфункция 12 =====================
1303
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1304
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1304
======================================================================
1305
======================================================================
1305
Параметры:
1306
Параметры:
1306
  * eax = 21 - номер функции
1307
  * eax = 21 - номер функции
1307
  * ebx = 12 - номер подфункции
1308
  * ebx = 12 - номер подфункции
1308
  * ecx = 0/1 - запретить/разрешить
1309
  * ecx = 0/1 - запретить/разрешить
1309
Возвращаемое значение:
1310
Возвращаемое значение:
1310
  * eax = 0
1311
  * eax = 0
1311
Замечания:
1312
Замечания:
1312
  * Используется при работе с шиной PCI (функция 62).
1313
  * Используется при работе с шиной PCI (функция 62).
1313
  * Текущая реализация использует только младший бит ecx.
1314
  * Текущая реализация использует только младший бит ecx.
1314
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
1315
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
1315
 
1316
 
1316
======================================================================
1317
======================================================================
1317
============ Функция 22 - установить системную дату/время. ===========
1318
============ Функция 22 - установить системную дату/время. ===========
1318
======================================================================
1319
======================================================================
1319
Параметры:
1320
Параметры:
1320
  * eax = 22 - номер функции
1321
  * eax = 22 - номер функции
1321
  * ebx = 0 - установить время
1322
  * ebx = 0 - установить время
1322
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1323
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1323
    * HH=час 00..23
1324
    * HH=час 00..23
1324
    * MM=минута 00..59
1325
    * MM=минута 00..59
1325
    * SS=секунда 00..59
1326
    * SS=секунда 00..59
1326
  * ebx = 1 - установить дату
1327
  * ebx = 1 - установить дату
1327
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1328
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1328
    * DD=день 01..31
1329
    * DD=день 01..31
1329
    * MM=месяц 01..12
1330
    * MM=месяц 01..12
1330
    * YY=год 00..99
1331
    * YY=год 00..99
1331
  * ebx = 2 - установить день недели
1332
  * ebx = 2 - установить день недели
1332
    * ecx = 1 для воскресенья, ..., 7 для субботы
1333
    * ecx = 1 для воскресенья, ..., 7 для субботы
1333
  * ebx = 3 - установить будильник
1334
  * ebx = 3 - установить будильник
1334
    * ecx = 0x00SSMMHH
1335
    * ecx = 0x00SSMMHH
1335
Возвращаемое значение:
1336
Возвращаемое значение:
1336
  * eax = 0 - успешно
1337
  * eax = 0 - успешно
1337
  * eax = 1 - параметр задан неверно
1338
  * eax = 1 - параметр задан неверно
1338
  * eax = 2 - CMOS-батарейки разрядились
1339
  * eax = 2 - CMOS-батарейки разрядились
1339
Замечания:
1340
Замечания:
1340
  * Ценность установки дня недели представляется сомнительной,
1341
  * Ценность установки дня недели представляется сомнительной,
1341
    поскольку он мало где используется
1342
    поскольку он мало где используется
1342
    (день недели можно рассчитать по дате).
1343
    (день недели можно рассчитать по дате).
1343
  * Будильник можно установить на срабатывание в заданное время
1344
  * Будильник можно установить на срабатывание в заданное время
1344
    каждые сутки. При этом отключить его существующими системными
1345
    каждые сутки. При этом отключить его существующими системными
1345
    функциями нельзя.
1346
    функциями нельзя.
1346
  * Срабатывание будильника заключается в генерации IRQ8.
1347
  * Срабатывание будильника заключается в генерации IRQ8.
1347
  * Вообще-то CMOS поддерживает для будильника установку значения
1348
  * Вообще-то CMOS поддерживает для будильника установку значения
1348
    0xFF в качестве одного из параметров и означает это, что
1349
    0xFF в качестве одного из параметров и означает это, что
1349
    соответствующий параметр игнорируется. Но в текущей реализации
1350
    соответствующий параметр игнорируется. Но в текущей реализации
1350
    это не пройдёт (вернётся значение 1).
1351
    это не пройдёт (вернётся значение 1).
1351
  * Будильник - глобальный системный ресурс; установка будильника
1352
  * Будильник - глобальный системный ресурс; установка будильника
1352
    автоматически отменяет предыдущую установку. Впрочем, на данный
1353
    автоматически отменяет предыдущую установку. Впрочем, на данный
1353
    момент ни одна программа его не использует.
1354
    момент ни одна программа его не использует.
1354
 
1355
 
1355
======================================================================
1356
======================================================================
1356
============== Функция 23 - ожидать события с таймаутом. =============
1357
============== Функция 23 - ожидать события с таймаутом. =============
1357
======================================================================
1358
======================================================================
1358
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1359
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1359
но не более указанного времени. Затем считывает сообщение из очереди.
1360
но не более указанного времени. Затем считывает сообщение из очереди.
1360
 
1361
 
1361
Параметры:
1362
Параметры:
1362
  * eax = 23 - номер функции
1363
  * eax = 23 - номер функции
1363
  * ebx = таймаут (в сотых долях секунды)
1364
  * ebx = таймаут (в сотых долях секунды)
1364
Возвращаемое значение:
1365
Возвращаемое значение:
1365
  * eax = 0 - очередь сообщений пуста
1366
  * eax = 0 - очередь сообщений пуста
1366
  * иначе eax = событие (смотри список событий)
1367
  * иначе eax = событие (смотри список событий)
1367
Замечания:
1368
Замечания:
1368
  * Учитываются только те события, которые входят в маску,
1369
  * Учитываются только те события, которые входят в маску,
1369
    устанавливаемую функцией 40. По умолчанию это события
1370
    устанавливаемую функцией 40. По умолчанию это события
1370
    перерисовки, нажатия на клавиши и на кнопки.
1371
    перерисовки, нажатия на клавиши и на кнопки.
1371
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1372
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1372
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1373
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1373
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1374
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1374
  * При текущей реализации произойдёт немедленный возврат из функции
1375
  * При текущей реализации произойдёт немедленный возврат из функции
1375
    с eax=0, если сложение ebx с текущим значением счётчика времени
1376
    с eax=0, если сложение ebx с текущим значением счётчика времени
1376
    вызовет 32-битное переполнение.
1377
    вызовет 32-битное переполнение.
1377
 
1378
 
1378
======================================================================
1379
======================================================================
1379
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
1380
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
1380
======================================================================
1381
======================================================================
1381
Параметры:
1382
Параметры:
1382
  * eax = 24 - номер функции
1383
  * eax = 24 - номер функции
1383
  * ebx = 4 - номер подфункции
1384
  * ebx = 4 - номер подфункции
1384
  * ecx = номер CD/DVD-диска
1385
  * ecx = номер CD/DVD-диска
1385
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1386
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1386
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1387
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1387
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1388
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1388
Возвращаемое значение:
1389
Возвращаемое значение:
1389
  * функция не возвращает значения
1390
  * функция не возвращает значения
1390
Замечания:
1391
Замечания:
1391
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1392
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1392
  * При извлечении лотка производится разблокировка ручного управления
1393
  * При извлечении лотка производится разблокировка ручного управления
1393
    механизмом лотка.
1394
    механизмом лотка.
1394
  * При извлечении лотка код производит очистку кэша соответствующего
1395
  * При извлечении лотка код производит очистку кэша соответствующего
1395
    устройства.
1396
    устройства.
1396
  * Примером использования функции является приложение CD_tray.
1397
  * Примером использования функции является приложение CD_tray.
1397
 
1398
 
1398
======================================================================
1399
======================================================================
1399
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
1400
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
1400
======================================================================
1401
======================================================================
1401
Параметры:
1402
Параметры:
1402
  * eax = 24 - номер функции
1403
  * eax = 24 - номер функции
1403
  * ebx = 5 - номер подфункции
1404
  * ebx = 5 - номер подфункции
1404
  * ecx = номер CD/DVD-диска
1405
  * ecx = номер CD/DVD-диска
1405
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1406
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1406
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1407
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1407
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1408
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1408
Возвращаемое значение:
1409
Возвращаемое значение:
1409
  * функция не возвращает значения
1410
  * функция не возвращает значения
1410
Замечания:
1411
Замечания:
1411
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1412
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1412
  * Примером использования функции является приложение CD_tray.
1413
  * Примером использования функции является приложение CD_tray.
1413
 
1414
 
1414
======================================================================
1415
======================================================================
1415
========== Функция 25 - записать область на слой фона. ===============
1416
========== Функция 25 - записать область на слой фона. ===============
1416
======================================================================
1417
======================================================================
1417
Параметры:
1418
Параметры:
1418
  * eax = 25 - номер функции
1419
  * eax = 25 - номер функции
1419
  * ebx = указатель на предварительно выделенную область памяти,
1420
  * ebx = указатель на предварительно выделенную область памяти,
1420
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1421
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1421
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1422
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1422
  * edx = [координата по оси x]*65536 + [координата по оси y]
1423
  * edx = [координата по оси x]*65536 + [координата по оси y]
1423
Возвращаемое значение:
1424
Возвращаемое значение:
1424
  * функция не возвращает значения
1425
  * функция не возвращает значения
1425
Замечания:
1426
Замечания:
1426
  * Координаты области - это координаты верхнего левого угла
1427
  * Координаты области - это координаты верхнего левого угла
1427
    области относительно экрана.
1428
    области относительно экрана.
1428
  * Размер изображения в байтах есть 4*xsize*ysize.
1429
  * Размер изображения в байтах есть 4*xsize*ysize.
1429
  * TT - байт указатель прозрачности, в настоящее время:
1430
  * TT - байт указатель прозрачности, в настоящее время:
1430
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1431
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1431
  * Функция размещает изображение не на фоновое изображение (ф.15),
1432
  * Функция размещает изображение не на фоновое изображение (ф.15),
1432
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
1433
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
1433
 
1434
 
1434
======================================================================
1435
======================================================================
1435
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
1436
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
1436
======================================================================
1437
======================================================================
1437
Параметры:
1438
Параметры:
1438
  * eax = 26 - номер функции
1439
  * eax = 26 - номер функции
1439
  * ebx = 1 - номер подфункции
1440
  * ebx = 1 - номер подфункции
1440
Возвращаемое значение:
1441
Возвращаемое значение:
1441
  * eax = номер порта
1442
  * eax = номер порта
1442
Замечания:
1443
Замечания:
1443
  * Установить базовый порт можно вызовом
1444
  * Установить базовый порт можно вызовом
1444
    подфункции 1 функции 21.
1445
    подфункции 1 функции 21.
1445
 
1446
 
1446
======================================================================
1447
======================================================================
1447
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
1448
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
1448
======================================================================
1449
======================================================================
1449
Раскладка клавиатуры используется для преобразования сканкодов,
1450
Раскладка клавиатуры используется для преобразования сканкодов,
1450
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1451
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1451
Параметры:
1452
Параметры:
1452
  * eax = 26 - номер функции
1453
  * eax = 26 - номер функции
1453
  * ebx = 2 - номер подфункции
1454
  * ebx = 2 - номер подфункции
1454
  * ecx = какую раскладку получать:
1455
  * ecx = какую раскладку получать:
1455
    * 1 = нормальную
1456
    * 1 = нормальную
1456
    * 2 = раскладку при нажатом Shift
1457
    * 2 = раскладку при нажатом Shift
1457
    * 3 = раскладку при нажатом Alt
1458
    * 3 = раскладку при нажатом Alt
1458
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1459
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1459
    раскладка
1460
    раскладка
1460
Возвращаемое значение:
1461
Возвращаемое значение:
1461
  * функция не возвращает значения
1462
  * функция не возвращает значения
1462
Или:
1463
Или:
1463
  * eax = 26 - номер функции
1464
  * eax = 26 - номер функции
1464
  * ebx = 2 - номер подфункции
1465
  * ebx = 2 - номер подфункции
1465
  * ecx = 9
1466
  * ecx = 9
1466
Возвращаемое значение:
1467
Возвращаемое значение:
1467
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1468
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1468
Замечания:
1469
Замечания:
1469
  * Если нажат Alt, то используется раскладка с Alt;
1470
  * Если нажат Alt, то используется раскладка с Alt;
1470
    если не нажат Alt, но нажат Shift, то используется
1471
    если не нажат Alt, но нажат Shift, то используется
1471
    раскладка с Shift;
1472
    раскладка с Shift;
1472
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1473
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1473
    нормальная раскладка, после чего из кода вычитается 0x60;
1474
    нормальная раскладка, после чего из кода вычитается 0x60;
1474
    если не нажата ни одна из управляющих клавиш, то используется
1475
    если не нажата ни одна из управляющих клавиш, то используется
1475
    нормальная раскладка.
1476
    нормальная раскладка.
1476
  * Установить раскладки и идентификатор страны можно с помощью
1477
  * Установить раскладки и идентификатор страны можно с помощью
1477
    подфункции 2 функции 21.
1478
    подфункции 2 функции 21.
1478
  * Идентификатор страны - глобальная системная переменная, которая
1479
  * Идентификатор страны - глобальная системная переменная, которая
1479
    самим ядром не используется; однако приложение @taskbar отображает
1480
    самим ядром не используется; однако приложение @taskbar отображает
1480
    соответствующую текущей стране иконку
1481
    соответствующую текущей стране иконку
1481
    (используя описываемую функцию).
1482
    (используя описываемую функцию).
1482
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1483
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1483
 
1484
 
1484
======================================================================
1485
======================================================================
1485
========== Функция 26, подфункция 5 - получить язык системы. =========
1486
========== Функция 26, подфункция 5 - получить язык системы. =========
1486
======================================================================
1487
======================================================================
1487
Параметры:
1488
Параметры:
1488
  * eax = 26 - номер функции
1489
  * eax = 26 - номер функции
1489
  * ebx = 5 - номер подфункции
1490
  * ebx = 5 - номер подфункции
1490
Возвращаемое значение:
1491
Возвращаемое значение:
1491
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1492
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1492
Замечания:
1493
Замечания:
1493
  * Язык системы - глобальная системная переменная, никак
1494
  * Язык системы - глобальная системная переменная, никак
1494
    не используемая самим ядром, однако приложение @taskbar рисует
1495
    не используемая самим ядром, однако приложение @taskbar рисует
1495
    соответствующую иконку (используя описываемую функцию).
1496
    соответствующую иконку (используя описываемую функцию).
1496
  * Установить язык системы можно вызовом подфункции 5 функции 21.
1497
  * Установить язык системы можно вызовом подфункции 5 функции 21.
1497
 
1498
 
1498
======================================================================
1499
======================================================================
1499
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
1500
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
1500
======================================================================
1501
======================================================================
1501
Параметры:
1502
Параметры:
1502
  * eax = 26 - номер функции
1503
  * eax = 26 - номер функции
1503
  * ebx = 9 - номер подфункции
1504
  * ebx = 9 - номер подфункции
1504
Возвращаемое значение:
1505
Возвращаемое значение:
1505
  * eax = число сотых долей секунды, прошедших с момента
1506
  * eax = число сотых долей секунды, прошедших с момента
1506
    запуска системы
1507
    запуска системы
1507
Замечания:
1508
Замечания:
1508
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1509
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1509
    497 суток.
1510
    497 суток.
1510
  * Системное время можно получить функцией 3.
1511
  * Системное время можно получить функцией 3.
1511
 
1512
 
1512
======================================================================
1513
======================================================================
1513
===================== Функция 26, подфункция 10 ======================
1514
===================== Функция 26, подфункция 10 ======================
1514
========== Получить значение высокоточного счётчика времени. =========
1515
========== Получить значение высокоточного счётчика времени. =========
1515
======================================================================
1516
======================================================================
1516
Parameters:
1517
Parameters:
1517
  * eax = 26 - номер функции
1518
  * eax = 26 - номер функции
1518
  * ebx = 10 - номер подфункции
1519
  * ebx = 10 - номер подфункции
1519
Returned value:
1520
Returned value:
1520
  * edx:eax = число наносекунд с момента загрузки ядра
1521
  * edx:eax = число наносекунд с момента загрузки ядра
1521
  * eax = младшее двойное слово
1522
  * eax = младшее двойное слово
1522
  * edx = старшее двойное слово  
1523
  * edx = старшее двойное слово  
1523
Remarks:
1524
Remarks:
1524
  * функция использует счётчик HPET, если HPET не доступен используется
1525
  * функция использует счётчик HPET, если HPET не доступен используется
1525
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1526
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1526
    наносекунд.
1527
    наносекунд.
1527
 
1528
 
1528
======================================================================
1529
======================================================================
1529
====================== Функция 26, подфункция 11 =====================
1530
====================== Функция 26, подфункция 11 =====================
1530
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1531
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1531
======================================================================
1532
======================================================================
1532
Параметры:
1533
Параметры:
1533
  * eax = 26 - номер функции
1534
  * eax = 26 - номер функции
1534
  * ebx = 11 - номер подфункции
1535
  * ebx = 11 - номер подфункции
1535
Возвращаемое значение:
1536
Возвращаемое значение:
1536
  * eax = 0/1 - запрещён/разрешён
1537
  * eax = 0/1 - запрещён/разрешён
1537
Замечания:
1538
Замечания:
1538
  * Используется при LBA-чтении (подфункция 8 функции 58).
1539
  * Используется при LBA-чтении (подфункция 8 функции 58).
1539
  * Установить текущее состояние можно вызовом
1540
  * Установить текущее состояние можно вызовом
1540
    подфункции 11 функции 21.
1541
    подфункции 11 функции 21.
1541
 
1542
 
1542
======================================================================
1543
======================================================================
1543
====================== Функция 26, подфункция 12 =====================
1544
====================== Функция 26, подфункция 12 =====================
1544
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1545
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1545
======================================================================
1546
======================================================================
1546
Параметры:
1547
Параметры:
1547
  * eax = 26 - номер функции
1548
  * eax = 26 - номер функции
1548
  * ebx = 12 - номер подфункции
1549
  * ebx = 12 - номер подфункции
1549
Возвращаемое значение:
1550
Возвращаемое значение:
1550
  * eax = 0/1 - запрещён/разрешён
1551
  * eax = 0/1 - запрещён/разрешён
1551
Замечания:
1552
Замечания:
1552
  * Используется при работе с шиной PCI (функция 62).
1553
  * Используется при работе с шиной PCI (функция 62).
1553
  * Текущая реализация использует только младший бит ecx.
1554
  * Текущая реализация использует только младший бит ecx.
1554
  * Установить текущее состояние можно вызовом
1555
  * Установить текущее состояние можно вызовом
1555
    подфункции 12 функции 21.
1556
    подфункции 12 функции 21.
1556
 
1557
 
1557
======================================================================
1558
======================================================================
1558
================ Функция 29 - получить системную дату. ===============
1559
================ Функция 29 - получить системную дату. ===============
1559
======================================================================
1560
======================================================================
1560
Параметры:
1561
Параметры:
1561
  * eax = 29 - номер функции
1562
  * eax = 29 - номер функции
1562
Возвращаемое значение:
1563
Возвращаемое значение:
1563
  * eax = 0x00DDMMYY, где
1564
  * eax = 0x00DDMMYY, где
1564
    (используется двоично-десятичное кодирование, BCD)
1565
    (используется двоично-десятичное кодирование, BCD)
1565
  * YY = две младшие цифры года (00..99)
1566
  * YY = две младшие цифры года (00..99)
1566
  * MM = месяц (01..12)
1567
  * MM = месяц (01..12)
1567
  * DD = день (01..31)
1568
  * DD = день (01..31)
1568
Замечания:
1569
Замечания:
1569
  * Системную дату можно установить функцией 22.
1570
  * Системную дату можно установить функцией 22.
1570
 
1571
 
1571
======================================================================
1572
======================================================================
1572
================ Функция 30 - работа с текущей папкой. ===============
1573
================ Функция 30 - работа с текущей папкой. ===============
1573
======================================================================
1574
======================================================================
1574
 
1575
 
1575
-------- Подфункция 1 - установить текущую папку для потока. ---------
1576
-------- Подфункция 1 - установить текущую папку для потока. ---------
1576
Параметры:
1577
Параметры:
1577
  * eax = 30 - номер функции
1578
  * eax = 30 - номер функции
1578
  * ebx = 1 - номер подфункции
1579
  * ebx = 1 - номер подфункции
1579
  * ecx = указатель на ASCIIZ-строку с путём к новой текущей папке
1580
  * ecx = указатель на ASCIIZ-строку с путём к новой текущей папке
1580
Возвращаемое значение:
1581
Возвращаемое значение:
1581
  * функция не возвращает значения
1582
  * функция не возвращает значения
1582
 
1583
 
1583
--------- Подфункция 2 - получить текущую папку для потока. ----------
1584
--------- Подфункция 2 - получить текущую папку для потока. ----------
1584
Параметры:
1585
Параметры:
1585
  * eax = 30 - номер функции
1586
  * eax = 30 - номер функции
1586
  * ebx = 2 - номер подфункции
1587
  * ebx = 2 - номер подфункции
1587
  * ecx = указатель на буфер
1588
  * ecx = указатель на буфер
1588
  * edx = размер буфера
1589
  * edx = размер буфера
1589
Возвращаемое значение:
1590
Возвращаемое значение:
1590
  * eax = длина имени текущей папки (включая завершающий 0)
1591
  * eax = длина имени текущей папки (включая завершающий 0)
1591
Замечания:
1592
Замечания:
1592
  * Если размера буфера недостаточно для копирования всего имени,
1593
  * Если размера буфера недостаточно для копирования всего имени,
1593
    копируются только первые (edx-1) байт и в конце ставится
1594
    копируются только первые (edx-1) байт и в конце ставится
1594
    завершающий 0.
1595
    завершающий 0.
1595
  * По умолчанию, текущая папка для потока - "/rd/1".
1596
  * По умолчанию, текущая папка для потока - "/rd/1".
1596
  * При создании процесса/потока текущая папка наследуется от
1597
  * При создании процесса/потока текущая папка наследуется от
1597
    родителя.
1598
    родителя.
1598
 
1599
 
1599
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1600
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1600
Параметры:
1601
Параметры:
1601
  * eax = 30 - номер функции
1602
  * eax = 30 - номер функции
1602
  * ebx = 3 - номер подфункции
1603
  * ebx = 3 - номер подфункции
1603
  * ecx = указатель на блок данных:
1604
  * ecx = указатель на блок данных:
1604
          sysdir_name     rb 64
1605
          sysdir_name     rb 64
1605
          sysdir_path     rb 64
1606
          sysdir_path     rb 64
1606
Пример:
1607
Пример:
1607
dir_name1       db 'KolibriOS',0
1608
dir_name1       db 'KolibriOS',0
1608
                rb 64-10
1609
                rb 64-10
1609
dir_path1       db 'HD0/1',0
1610
dir_path1       db 'HD0/1',0
1610
                rb 64-6
1611
                rb 64-6
1611
Возвращаемое значение:
1612
Возвращаемое значение:
1612
  * функция не возвращает значения
1613
  * функция не возвращает значения
1613
Замечания:
1614
Замечания:
1614
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
1615
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
1615
 
1616
 
1616
======================================================================
1617
======================================================================
1617
========= Функция 34 - узнать кому принадлежит точка экрана. =========
1618
========= Функция 34 - узнать кому принадлежит точка экрана. =========
1618
======================================================================
1619
======================================================================
1619
Параметры:
1620
Параметры:
1620
  * eax = 34 - номер функции
1621
  * eax = 34 - номер функции
1621
  * ebx = x-координата (относительно экрана)
1622
  * ebx = x-координата (относительно экрана)
1622
  * ecx = y-координата (относительно экрана)
1623
  * ecx = y-координата (относительно экрана)
1623
 
1624
 
1624
Возвращаемое значение:
1625
Возвращаемое значение:
1625
  * eax = 0x000000XX - точка принадлежит слоту окна N
1626
  * eax = 0x000000XX - точка принадлежит слоту окна N
1626
    При некорректных значениях ebx и ecx функция возвращает 0
1627
    При некорректных значениях ebx и ecx функция возвращает 0
1627
  * Функция берет значения из области [_WinMapAddress]
1628
  * Функция берет значения из области [_WinMapAddress]
1628
 
1629
 
1629
======================================================================
1630
======================================================================
1630
============ Функция 35 - прочитать цвет точки на экране. ============
1631
============ Функция 35 - прочитать цвет точки на экране. ============
1631
======================================================================
1632
======================================================================
1632
Параметры:
1633
Параметры:
1633
  * eax = 35
1634
  * eax = 35
1634
  * ebx = y*xsize+x, где
1635
  * ebx = y*xsize+x, где
1635
  * (x,y) = координаты точки (считая от 0)
1636
  * (x,y) = координаты точки (считая от 0)
1636
  * xsize = размер экрана по горизонтали
1637
  * xsize = размер экрана по горизонтали
1637
Возвращаемое значение:
1638
Возвращаемое значение:
1638
  * eax = цвет 0x00RRGGBB
1639
  * eax = цвет 0x00RRGGBB
1639
Замечания:
1640
Замечания:
1640
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1641
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1641
    что она вычитает 1 из обоих размеров.
1642
    что она вычитает 1 из обоих размеров.
1642
  * К видеопамяти есть также прямой доступ (без вызовов системных
1643
  * К видеопамяти есть также прямой доступ (без вызовов системных
1643
    функций) через селектор gs. Параметры текущего видеорежима
1644
    функций) через селектор gs. Параметры текущего видеорежима
1644
    можно получить функцией 61.
1645
    можно получить функцией 61.
1645
 
1646
 
1646
======================================================================
1647
======================================================================
1647
=============== Функция 36 - прочитать область экрана. ===============
1648
=============== Функция 36 - прочитать область экрана. ===============
1648
======================================================================
1649
======================================================================
1649
Параметры:
1650
Параметры:
1650
  * eax = 36 - номер функции
1651
  * eax = 36 - номер функции
1651
  * ebx = указатель на предварительно выделенную область памяти,
1652
  * ebx = указатель на предварительно выделенную область памяти,
1652
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1653
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1653
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1654
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1654
  * edx = [координата по оси x]*65536 + [координата по оси y]
1655
  * edx = [координата по оси x]*65536 + [координата по оси y]
1655
Возвращаемое значение:
1656
Возвращаемое значение:
1656
  * функция не возвращает значения
1657
  * функция не возвращает значения
1657
Замечания:
1658
Замечания:
1658
  * Координаты области - это координаты верхнего левого угла
1659
  * Координаты области - это координаты верхнего левого угла
1659
    области относительно экрана.
1660
    области относительно экрана.
1660
  * Размер изображения в байтах есть 3*xsize*ysize.
1661
  * Размер изображения в байтах есть 3*xsize*ysize.
1661
 
1662
 
1662
======================================================================
1663
======================================================================
1663
==================== Функция 37 - работа с мышью. ====================
1664
==================== Функция 37 - работа с мышью. ====================
1664
======================================================================
1665
======================================================================
1665
 
1666
 
1666
-------------- Подфункция 0 - экранные координаты мыши ---------------
1667
-------------- Подфункция 0 - экранные координаты мыши ---------------
1667
Параметры:
1668
Параметры:
1668
  * eax = 37 - номер функции
1669
  * eax = 37 - номер функции
1669
  * ebx = 0 - номер подфункции
1670
  * ebx = 0 - номер подфункции
1670
Возвращаемое значение:
1671
Возвращаемое значение:
1671
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
1672
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
1672
 
1673
 
1673
---------- Подфункция 1 - координаты мыши относительно окна ----------
1674
---------- Подфункция 1 - координаты мыши относительно окна ----------
1674
Параметры:
1675
Параметры:
1675
  * eax = 37 - номер функции
1676
  * eax = 37 - номер функции
1676
  * ebx = 1 - номер подфункции
1677
  * ebx = 1 - номер подфункции
1677
Возвращаемое значение:
1678
Возвращаемое значение:
1678
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1679
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1679
    окна приложения (считая от 0)
1680
    окна приложения (считая от 0)
1680
Замечания:
1681
Замечания:
1681
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1682
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1682
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1683
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1683
    относительную y-координату, а старшее - относительную x-координату
1684
    относительную y-координату, а старшее - относительную x-координату
1684
    (правильного знака). В противном случае младшее слово отрицательно
1685
    (правильного знака). В противном случае младшее слово отрицательно
1685
    и всё равно содержит относительную y-координату,
1686
    и всё равно содержит относительную y-координату,
1686
    а к старшему слову следует прибавить 1.
1687
    а к старшему слову следует прибавить 1.
1687
 
1688
 
1688
---------------- Подфункция 2 - состояния кнопок мыши ----------------
1689
---------------- Подфункция 2 - состояния кнопок мыши ----------------
1689
Параметры:
1690
Параметры:
1690
  * eax = 37 - номер функции
1691
  * eax = 37 - номер функции
1691
  * ebx = 2 - номер подфункции
1692
  * ebx = 2 - номер подфункции
1692
Возвращаемое значение:
1693
Возвращаемое значение:
1693
  * eax = биты 0-4 соответствуют подфункции 3
1694
  * eax = биты 0-4 соответствуют подфункции 3
1694
 
1695
 
1695
----------- Подфункция 3 - состояния и события кнопок мыши -----------
1696
----------- Подфункция 3 - состояния и события кнопок мыши -----------
1696
Параметры:
1697
Параметры:
1697
  * eax = 37 - номер функции
1698
  * eax = 37 - номер функции
1698
  * ebx = 3 - номер подфункции
1699
  * ebx = 3 - номер подфункции
1699
Возвращаемое значение:
1700
Возвращаемое значение:
1700
  * eax содержит следующую информацию:
1701
  * eax содержит следующую информацию:
1701
 
1702
 
1702
состояния:
1703
состояния:
1703
  * бит 0 установлен = удерживается левая кнопка
1704
  * бит 0 установлен = удерживается левая кнопка
1704
  * бит 1 установлен = удерживается правая кнопка
1705
  * бит 1 установлен = удерживается правая кнопка
1705
  * бит 2 установлен = удерживается средняя кнопка
1706
  * бит 2 установлен = удерживается средняя кнопка
1706
  * бит 3 установлен = удерживается 4-я кнопка
1707
  * бит 3 установлен = удерживается 4-я кнопка
1707
  * бит 4 установлен = удерживается 5-я кнопка
1708
  * бит 4 установлен = удерживается 5-я кнопка
1708
 
1709
 
1709
события:
1710
события:
1710
  * бит 8 установлен  = нажата левая кнопка
1711
  * бит 8 установлен  = нажата левая кнопка
1711
  * бит 9 установлен  = нажата правая кнопка
1712
  * бит 9 установлен  = нажата правая кнопка
1712
  * бит 10 установлен = нажата средняя кнопка
1713
  * бит 10 установлен = нажата средняя кнопка
1713
 
1714
 
1714
  * бит 15 установлен = используется вертикальная прокрутка
1715
  * бит 15 установлен = используется вертикальная прокрутка
1715
 
1716
 
1716
  * бит 16 установлен = отпущена левая кнопка
1717
  * бит 16 установлен = отпущена левая кнопка
1717
  * бит 17 установлен = отпущена правая кнопка
1718
  * бит 17 установлен = отпущена правая кнопка
1718
  * бит 18 установлен = отпущена средняя кнопка
1719
  * бит 18 установлен = отпущена средняя кнопка
1719
 
1720
 
1720
  * бит 23 установлен = используется горизонтальная прокрутка
1721
  * бит 23 установлен = используется горизонтальная прокрутка
1721
 
1722
 
1722
  * бит 24 установлен = двойной щелчёк левой кнопкой
1723
  * бит 24 установлен = двойной щелчёк левой кнопкой
1723
 
1724
 
1724
------------------ Подфункция 4 - загрузить курсор -------------------
1725
------------------ Подфункция 4 - загрузить курсор -------------------
1725
Параметры:
1726
Параметры:
1726
  * eax = 37 - номер функции
1727
  * eax = 37 - номер функции
1727
  * ebx = 4 - номер подфункции
1728
  * ebx = 4 - номер подфункции
1728
  * dx = источник данных:
1729
  * dx = источник данных:
1729
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1730
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1730
    * ecx = указатель на полный путь к файлу курсора
1731
    * ecx = указатель на полный путь к файлу курсора
1731
    * файл курсора должен быть в формате .cur, стандартном для
1732
    * файл курсора должен быть в формате .cur, стандартном для
1732
      MS Windows, причём размером 32*32 пикселя
1733
      MS Windows, причём размером 32*32 пикселя
1733
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1734
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1734
    * ecx = указатель на данные файла курсора
1735
    * ecx = указатель на данные файла курсора
1735
    * формат данных такой же, как и в предыдущем случае
1736
    * формат данных такой же, как и в предыдущем случае
1736
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1737
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1737
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1738
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1738
    * edx = 0xXXYY0002, где
1739
    * edx = 0xXXYY0002, где
1739
      * XX = x-координата "горячей точки" курсора
1740
      * XX = x-координата "горячей точки" курсора
1740
      * YY = y-координата
1741
      * YY = y-координата
1741
      * 0 <= XX, YY <= 31
1742
      * 0 <= XX, YY <= 31
1742
Возвращаемое значение:
1743
Возвращаемое значение:
1743
  * eax = 0 - неудача
1744
  * eax = 0 - неудача
1744
  * иначе eax = хэндл курсора
1745
  * иначе eax = хэндл курсора
1745
 
1746
 
1746
------------------ Подфункция 5 - установить курсор ------------------
1747
------------------ Подфункция 5 - установить курсор ------------------
1747
Устанавливает новый курсор для окна текущего потока.
1748
Устанавливает новый курсор для окна текущего потока.
1748
Параметры:
1749
Параметры:
1749
  * eax = 37 - номер функции
1750
  * eax = 37 - номер функции
1750
  * ebx = 5 - номер подфункции
1751
  * ebx = 5 - номер подфункции
1751
  * ecx = хэндл курсора
1752
  * ecx = хэндл курсора
1752
Возвращаемое значение:
1753
Возвращаемое значение:
1753
  * eax = хэндл предыдущего установленного курсора
1754
  * eax = хэндл предыдущего установленного курсора
1754
Замечания:
1755
Замечания:
1755
  * Если передан некорректный хэндл, то функция восстановит курсор
1756
  * Если передан некорректный хэндл, то функция восстановит курсор
1756
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1757
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1757
    курсора по умолчанию приводит передача ecx=0.
1758
    курсора по умолчанию приводит передача ecx=0.
1758
 
1759
 
1759
------------------- Подфункция 6 - удалить курсор --------------------
1760
------------------- Подфункция 6 - удалить курсор --------------------
1760
Параметры:
1761
Параметры:
1761
  * eax = 37 - номер функции
1762
  * eax = 37 - номер функции
1762
  * ebx = 6 - номер подфункции
1763
  * ebx = 6 - номер подфункции
1763
  * ecx = хэндл курсора
1764
  * ecx = хэндл курсора
1764
Возвращаемое значение:
1765
Возвращаемое значение:
1765
  * eax разрушается
1766
  * eax разрушается
1766
Замечания:
1767
Замечания:
1767
  * Курсор должен был быть ранее загружен текущим потоком
1768
  * Курсор должен был быть ранее загружен текущим потоком
1768
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1769
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1769
    курсоры, загруженные другими приложениями.
1770
    курсоры, загруженные другими приложениями.
1770
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1771
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1771
    восстанавливается курсор по умолчанию (стандартная стрелка).
1772
    восстанавливается курсор по умолчанию (стандартная стрелка).
1772
 
1773
 
1773
------------------ Подфункция 7 - данные прокрутки -------------------
1774
------------------ Подфункция 7 - данные прокрутки -------------------
1774
Параметры:
1775
Параметры:
1775
  * eax = 37 - номер функции
1776
  * eax = 37 - номер функции
1776
  * ebx = 7 - номер подфункции
1777
  * ebx = 7 - номер подфункции
1777
Возвращаемое значение:
1778
Возвращаемое значение:
1778
  * eax = [horizontal offset]*65536 + [vertical offset]
1779
  * eax = [horizontal offset]*65536 + [vertical offset]
1779
Замечания:
1780
Замечания:
1780
  * Данные доступны только активному окну.
1781
  * Данные доступны только активному окну.
1781
  * После прочтения значения обнуляются.
1782
  * После прочтения значения обнуляются.
1782
  * Данные имеют знаковые значения.
1783
  * Данные имеют знаковые значения.
1783
 
1784
 
1784
======================================================================
1785
======================================================================
1785
================== Функция 38 - нарисовать отрезок. ==================
1786
================== Функция 38 - нарисовать отрезок. ==================
1786
======================================================================
1787
======================================================================
1787
Параметры:
1788
Параметры:
1788
  * eax = 38 - номер функции
1789
  * eax = 38 - номер функции
1789
  * ebx = [координата начала по оси x]*65536 +
1790
  * ebx = [координата начала по оси x]*65536 +
1790
              [координата конца по оси x]
1791
              [координата конца по оси x]
1791
  * ecx = [координата начала по оси y]*65536 +
1792
  * ecx = [координата начала по оси y]*65536 +
1792
              [координата конца по оси y]
1793
              [координата конца по оси y]
1793
  * edx = 0x00RRGGBB - цвет
1794
  * edx = 0x00RRGGBB - цвет
1794
    edx = 0x01xxxxxx - рисовать инверсный отрезок
1795
    edx = 0x01xxxxxx - рисовать инверсный отрезок
1795
          (младшие 24 бита игнорируются)
1796
          (младшие 24 бита игнорируются)
1796
Возвращаемое значение:
1797
Возвращаемое значение:
1797
  * функция не возвращает значения
1798
  * функция не возвращает значения
1798
Замечания:
1799
Замечания:
1799
  * Координаты берутся относительно окна.
1800
  * Координаты берутся относительно окна.
1800
  * Конечная точка также рисуется.
1801
  * Конечная точка также рисуется.
1801
 
1802
 
1802
======================================================================
1803
======================================================================
1803
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
1804
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
1804
======================================================================
1805
======================================================================
1805
Параметры:
1806
Параметры:
1806
  * eax = 39 - номер функции
1807
  * eax = 39 - номер функции
1807
  * ebx = 1 - номер подфункции
1808
  * ebx = 1 - номер подфункции
1808
Возвращаемое значение:
1809
Возвращаемое значение:
1809
  * eax = [ширина]*65536 + [высота]
1810
  * eax = [ширина]*65536 + [высота]
1810
Замечания:
1811
Замечания:
1811
  * Есть парная команда установки размеров фонового изображения -
1812
  * Есть парная команда установки размеров фонового изображения -
1812
    подфункция 1 функции 15. После которой, разумеется, следует
1813
    подфункция 1 функции 15. После которой, разумеется, следует
1813
    заново определить само изображение.
1814
    заново определить само изображение.
1814
 
1815
 
1815
======================================================================
1816
======================================================================
1816
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
1817
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
1817
======================================================================
1818
======================================================================
1818
Параметры:
1819
Параметры:
1819
  * eax = 39 - номер функции
1820
  * eax = 39 - номер функции
1820
  * ebx = 2 - номер подфункции
1821
  * ebx = 2 - номер подфункции
1821
  * ecx = смещение
1822
  * ecx = смещение
1822
Возвращаемое значение:
1823
Возвращаемое значение:
1823
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1824
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1824
    (меньше 0x160000-16)
1825
    (меньше 0x160000-16)
1825
  * eax = 2 - иначе
1826
  * eax = 2 - иначе
1826
Замечания:
1827
Замечания:
1827
  * Не следует полагаться на возвращаемое значение в случае неверного
1828
  * Не следует полагаться на возвращаемое значение в случае неверного
1828
    смещения, оно может измениться в следующих версиях ядра.
1829
    смещения, оно может измениться в следующих версиях ядра.
1829
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
1830
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
1830
  * Есть парная функция установки точки на фоновом изображении -
1831
  * Есть парная функция установки точки на фоновом изображении -
1831
    подфункция 2 функции 15.
1832
    подфункция 2 функции 15.
1832
 
1833
 
1833
======================================================================
1834
======================================================================
1834
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
1835
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
1835
======================================================================
1836
======================================================================
1836
Параметры:
1837
Параметры:
1837
  * eax = 39 - номер функции
1838
  * eax = 39 - номер функции
1838
  * ebx = 4 - номер подфункции
1839
  * ebx = 4 - номер подфункции
1839
Возвращаемое значение:
1840
Возвращаемое значение:
1840
  * eax = 1 - замостить
1841
  * eax = 1 - замостить
1841
  * eax = 2 - растянуть
1842
  * eax = 2 - растянуть
1842
Замечания:
1843
Замечания:
1843
  * Есть парная функция установки режима отрисовки фона -
1844
  * Есть парная функция установки режима отрисовки фона -
1844
    подфункция 4 функции 15.
1845
    подфункция 4 функции 15.
1845
 
1846
 
1846
======================================================================
1847
======================================================================
1847
======== Функция 40 - установить маску для ожидаемых событий. ========
1848
======== Функция 40 - установить маску для ожидаемых событий. ========
1848
======================================================================
1849
======================================================================
1849
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1850
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1850
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1851
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1851
Параметры:
1852
Параметры:
1852
  * eax = 40 - номер функции
1853
  * eax = 40 - номер функции
1853
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1854
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1854
    (установленный бит разрешает извещение о событии)
1855
    (установленный бит разрешает извещение о событии)
1855
    bit 31: фильтр активности событий мыши
1856
    bit 31: фильтр активности событий мыши
1856
    bit 31 = 0 - неактивное окно всегда получает события от мыши
1857
    bit 31 = 0 - неактивное окно всегда получает события от мыши
1857
    bit 31 = 1 - неактивное окно не получает события от мыши
1858
    bit 31 = 1 - неактивное окно не получает события от мыши
1858
    bit 30: фильтр позиции курсора
1859
    bit 30: фильтр позиции курсора
1859
    bit 30 = 0 - окно принимает события мыши, если курсор
1860
    bit 30 = 0 - окно принимает события мыши, если курсор
1860
                 за пределами окна
1861
                 за пределами окна
1861
    bit 30 = 1 - окно не принимает события мыши, если курсор
1862
    bit 30 = 1 - окно не принимает события мыши, если курсор
1862
                 за пределами окна
1863
                 за пределами окна
1863
Возвращаемое значение:
1864
Возвращаемое значение:
1864
  * eax = предыдущее значение маски
1865
  * eax = предыдущее значение маски
1865
Замечания:
1866
Замечания:
1866
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1867
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1867
    и нажатиях клавиш и кнопок.
1868
    и нажатиях клавиш и кнопок.
1868
    Этого достаточно для большинства приложений.
1869
    Этого достаточно для большинства приложений.
1869
  * События, запрещённые в маске, всё равно сохраняются, если
1870
  * События, запрещённые в маске, всё равно сохраняются, если
1870
    приходят; о них просто не извещают функции работы с событиями.
1871
    приходят; о них просто не извещают функции работы с событиями.
1871
  * Функции работы с событиями учитывают маску на момент
1872
  * Функции работы с событиями учитывают маску на момент
1872
    вызова функции, а не на момент поступления сообщения.
1873
    вызова функции, а не на момент поступления сообщения.
1873
 
1874
 
1874
 
1875
 
1875
======================================================================
1876
======================================================================
1876
=================== Функция 43 - ввод/вывод в порт. ==================
1877
=================== Функция 43 - ввод/вывод в порт. ==================
1877
======================================================================
1878
======================================================================
1878
 
1879
 
1879
------------------------ Вывод данных в порт -------------------------
1880
------------------------ Вывод данных в порт -------------------------
1880
Параметры:
1881
Параметры:
1881
  * eax = 43 - номер функции
1882
  * eax = 43 - номер функции
1882
  * bl = байт для вывода
1883
  * bl = байт для вывода
1883
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1884
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1884
Возвращаемое значение:
1885
Возвращаемое значение:
1885
  * eax = 0 - успешно
1886
  * eax = 0 - успешно
1886
  * eax = 1 - поток не зарезервировал указанный порт
1887
  * eax = 1 - поток не зарезервировал указанный порт
1887
 
1888
 
1888
------------------------ Ввод данных из порта ------------------------
1889
------------------------ Ввод данных из порта ------------------------
1889
Параметры:
1890
Параметры:
1890
  * eax = 43 - номер функции
1891
  * eax = 43 - номер функции
1891
  * ebx игнорируется
1892
  * ebx игнорируется
1892
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1893
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1893
Возвращаемое значение:
1894
Возвращаемое значение:
1894
  * eax = 0 - успешно, при этом ebx = введённый байт
1895
  * eax = 0 - успешно, при этом ebx = введённый байт
1895
  * eax = 1 - поток не зарезервировал данный порт
1896
  * eax = 1 - поток не зарезервировал данный порт
1896
Замечания:
1897
Замечания:
1897
  * Предварительно поток должен зарезервировать за собой
1898
  * Предварительно поток должен зарезервировать за собой
1898
    указанный порт функцией 46.
1899
    указанный порт функцией 46.
1899
  * Для зарезервированных портов вместо вызова этих функций
1900
  * Для зарезервированных портов вместо вызова этих функций
1900
    лучше использовать команды процессора in/out - это значительно
1901
    лучше использовать команды процессора in/out - это значительно
1901
    быстрее и несколько короче и проще. Из незарезервированных
1902
    быстрее и несколько короче и проще. Из незарезервированных
1902
    портов читать всё равно нельзя.
1903
    портов читать всё равно нельзя.
1903
 
1904
 
1904
 
1905
 
1905
======================================================================
1906
======================================================================
1906
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
1907
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
1907
======================================================================
1908
======================================================================
1908
К зарезервированным портам можно обращаться напрямую из приложения
1909
К зарезервированным портам можно обращаться напрямую из приложения
1909
командами in/out (рекомендуемый способ) и вызовом функции 43
1910
командами in/out (рекомендуемый способ) и вызовом функции 43
1910
(нерекомендуемый способ).
1911
(нерекомендуемый способ).
1911
Параметры:
1912
Параметры:
1912
  * eax = 46 - номер функции
1913
  * eax = 46 - номер функции
1913
  * ebx = 0 - зарезервировать, 1 - освободить
1914
  * ebx = 0 - зарезервировать, 1 - освободить
1914
  * ecx = номер начала диапазона портов
1915
  * ecx = номер начала диапазона портов
1915
  * edx = номер конца диапазона портов (включительно)
1916
  * edx = номер конца диапазона портов (включительно)
1916
Возвращаемое значение:
1917
Возвращаемое значение:
1917
  * eax = 0 - успешно
1918
  * eax = 0 - успешно
1918
  * eax = 1 - ошибка
1919
  * eax = 1 - ошибка
1919
Замечания:
1920
Замечания:
1920
  * В случае резервирования портов ошибкой считается выполнение
1921
  * В случае резервирования портов ошибкой считается выполнение
1921
    одного из условий:
1922
    одного из условий:
1922
    * начальный адрес больше конечного;
1923
    * начальный адрес больше конечного;
1923
    * указанный диапазон содержит некорректный номер порта
1924
    * указанный диапазон содержит некорректный номер порта
1924
      (корректные - от 0 до 0xFFFF);
1925
      (корректные - от 0 до 0xFFFF);
1925
    * превышено ограничение на общее число зарезервированных областей
1926
    * превышено ограничение на общее число зарезервированных областей
1926
      - допускается максимум 255;
1927
      - допускается максимум 255;
1927
    * указанный диапазон пересекается с одним из
1928
    * указанный диапазон пересекается с одним из
1928
      ранее зарезервированных
1929
      ранее зарезервированных
1929
  * В случае освобождения портов ошибкой считается попытка
1930
  * В случае освобождения портов ошибкой считается попытка
1930
    освобождения диапазона, который ранее не был целиком
1931
    освобождения диапазона, который ранее не был целиком
1931
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
1932
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
1932
  * При обнаружении ошибки (в обоих случаях) никаких действий
1933
  * При обнаружении ошибки (в обоих случаях) никаких действий
1933
    не производится.
1934
    не производится.
1934
  * При загрузке система резервирует за собой порты
1935
  * При загрузке система резервирует за собой порты
1935
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
1936
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
1936
  * При завершении потока автоматически освобождаются все
1937
  * При завершении потока автоматически освобождаются все
1937
    зарезервированные им порты.
1938
    зарезервированные им порты.
1938
 
1939
 
1939
======================================================================
1940
======================================================================
1940
================= Функция 47 - вывести число в окно. =================
1941
================= Функция 47 - вывести число в окно. =================
1941
======================================================================
1942
======================================================================
1942
Параметры:
1943
Параметры:
1943
  * eax = 47 - номер функции
1944
  * eax = 47 - номер функции
1944
  * ebx = параметры преобразования числа в текст:
1945
  * ebx = параметры преобразования числа в текст:
1945
    * bl = 0 - ecx содержит число
1946
    * bl = 0 - ecx содержит число
1946
    * bl = 1 - ecx содержит указатель на dword/qword-число
1947
    * bl = 1 - ecx содержит указатель на dword/qword-число
1947
    * bh = 0 - отображать в десятичной системе счисления
1948
    * bh = 0 - отображать в десятичной системе счисления
1948
    * bh = 1 - отображать в шестнадцатеричной системе
1949
    * bh = 1 - отображать в шестнадцатеричной системе
1949
    * bh = 2 - отображать в двоичной системе
1950
    * bh = 2 - отображать в двоичной системе
1950
    * биты 16-21 = сколько цифр отображать
1951
    * биты 16-21 = сколько цифр отображать
1951
    * биты 22-29 зарезервированы и должны быть установлены в 0
1952
    * биты 22-29 зарезервированы и должны быть установлены в 0
1952
    * бит 30 установлен = выводить qword (64-битное число);
1953
    * бит 30 установлен = выводить qword (64-битное число);
1953
                              при этом должно быть bl = 1
1954
                              при этом должно быть bl = 1
1954
    * бит 31 установлен = не выводить ведущие нули числа
1955
    * бит 31 установлен = не выводить ведущие нули числа
1955
  * ecx = число (при bl=0) или указатель (при bl=1)
1956
  * ecx = число (при bl=0) или указатель (при bl=1)
1956
  * edx = [координата по оси x]*65536 + [координата по оси y]
1957
  * edx = [координата по оси x]*65536 + [координата по оси y]
1957
  * esi = 0xX0RRGGBB:
1958
  * esi = 0xX0RRGGBB:
1958
    * RR, GG, BB задают цвет
1959
    * RR, GG, BB задают цвет
1959
    * X = ABnn (биты)
1960
    * X = ABnn (биты)
1960
    * nn = шрифт (0/1)
1961
    * nn = шрифт (0/1)
1961
    * A игнорируется
1962
    * A игнорируется
1962
    * B=1 - закрашивать фон цветом edi
1963
    * B=1 - закрашивать фон цветом edi
1963
Возвращаемое значение:
1964
Возвращаемое значение:
1964
  * функция не возвращает значения
1965
  * функция не возвращает значения
1965
Замечания:
1966
Замечания:
1966
  * Указанная длина не должна превосходить 60.
1967
  * Указанная длина не должна превосходить 60.
1967
  * Выводится ровно указанное количество цифр. Если число мало и
1968
  * Выводится ровно указанное количество цифр. Если число мало и
1968
    может быть записано меньшим количеством цифр, оно дополняется
1969
    может быть записано меньшим количеством цифр, оно дополняется
1969
    ведущими нулями; если число велико и не может быть записано
1970
    ведущими нулями; если число велико и не может быть записано
1970
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
1971
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
1971
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
1972
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
1972
 
1973
 
1973
======================================================================
1974
======================================================================
1974
======= Функция 48, подфункция 0 - применить настройки экрана. =======
1975
======= Функция 48, подфункция 0 - применить настройки экрана. =======
1975
======================================================================
1976
======================================================================
1976
Параметры:
1977
Параметры:
1977
  * eax = 48 - номер функции
1978
  * eax = 48 - номер функции
1978
  * ebx = 0 - номер подфункции
1979
  * ebx = 0 - номер подфункции
1979
  * ecx = 0 - зарезервировано
1980
  * ecx = 0 - зарезервировано
1980
Возвращаемое значение:
1981
Возвращаемое значение:
1981
  * функция не возвращает значения
1982
  * функция не возвращает значения
1982
Замечания:
1983
Замечания:
1983
  * Функция перерисовывает экран после изменения параметров
1984
  * Функция перерисовывает экран после изменения параметров
1984
    подфункциями 1 и 2.
1985
    подфункциями 1 и 2.
1985
  * Вызов функции без предшествующих вызовов указанных подфункций
1986
  * Вызов функции без предшествующих вызовов указанных подфункций
1986
    игнорируется.
1987
    игнорируется.
1987
  * Вызов функции с ненулевым ecx игнорируется.
1988
  * Вызов функции с ненулевым ecx игнорируется.
1988
 
1989
 
1989
======================================================================
1990
======================================================================
1990
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
1991
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
1991
======================================================================
1992
======================================================================
1992
Параметры:
1993
Параметры:
1993
  * eax = 48 - номер функции
1994
  * eax = 48 - номер функции
1994
  * ebx = 1 - номер подфункции
1995
  * ebx = 1 - номер подфункции
1995
  * ecx = тип кнопок:
1996
  * ecx = тип кнопок:
1996
    * 0 = плоские
1997
    * 0 = плоские
1997
    * 1 = объёмные
1998
    * 1 = объёмные
1998
Возвращаемое значение:
1999
Возвращаемое значение:
1999
  * функция не возвращает значения
2000
  * функция не возвращает значения
2000
Замечания:
2001
Замечания:
2001
  * После вызова описываемой функции следует перерисовать экран
2002
  * После вызова описываемой функции следует перерисовать экран
2002
    подфункцией 0.
2003
    подфункцией 0.
2003
  * Тип кнопок влияет только на их прорисовку функцией 8.
2004
  * Тип кнопок влияет только на их прорисовку функцией 8.
2004
 
2005
 
2005
======================================================================
2006
======================================================================
2006
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
2007
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
2007
======================================================================
2008
======================================================================
2008
Параметры:
2009
Параметры:
2009
  * eax = 48 - номер функции
2010
  * eax = 48 - номер функции
2010
  * ebx = 2 - номер подфункции
2011
  * ebx = 2 - номер подфункции
2011
  * ecx = указатель на таблицу цветов
2012
  * ecx = указатель на таблицу цветов
2012
  * edx = размер таблицы цветов
2013
  * edx = размер таблицы цветов
2013
    (должен быть 40 байт для будущей совместимости)
2014
    (должен быть 40 байт для будущей совместимости)
2014
Формат таблицы цветов указан в описании подфункции 3.
2015
Формат таблицы цветов указан в описании подфункции 3.
2015
Возвращаемое значение:
2016
Возвращаемое значение:
2016
  * функция не возвращает значения
2017
  * функция не возвращает значения
2017
Замечания:
2018
Замечания:
2018
  * После вызова описываемой функции следует перерисовать экран
2019
  * После вызова описываемой функции следует перерисовать экран
2019
    подфункцией 0.
2020
    подфункцией 0.
2020
  * Таблица стандартных цветов влияет только на приложения,
2021
  * Таблица стандартных цветов влияет только на приложения,
2021
    которые эту таблицу явным образом получают (подфункцией 3) и
2022
    которые эту таблицу явным образом получают (подфункцией 3) и
2022
    используют (указывая цвета из неё при вызовах функций рисования).
2023
    используют (указывая цвета из неё при вызовах функций рисования).
2023
  * Таблица стандартных цветов входит в скин и устанавливается заново
2024
  * Таблица стандартных цветов входит в скин и устанавливается заново
2024
    при установке скина (подфункции 8).
2025
    при установке скина (подфункции 8).
2025
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2026
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2026
    приложения desktop.
2027
    приложения desktop.
2027
 
2028
 
2028
======================================================================
2029
======================================================================
2029
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
2030
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
2030
======================================================================
2031
======================================================================
2031
Параметры:
2032
Параметры:
2032
  * eax = 48 - номер функции
2033
  * eax = 48 - номер функции
2033
  * ebx = 3 - номер подфункции
2034
  * ebx = 3 - номер подфункции
2034
  * ecx = указатель на буфер размером edx байт,
2035
  * ecx = указатель на буфер размером edx байт,
2035
    куда будет записана таблица
2036
    куда будет записана таблица
2036
  * edx = размер таблицы цветов
2037
  * edx = размер таблицы цветов
2037
    (должен быть 40 байт для будущей совместимости)
2038
    (должен быть 40 байт для будущей совместимости)
2038
Возвращаемое значение:
2039
Возвращаемое значение:
2039
  * функция не возвращает значения
2040
  * функция не возвращает значения
2040
Формат таблицы цветов: каждый элемент -
2041
Формат таблицы цветов: каждый элемент -
2041
dword-значение цвета 0x00RRGGBB
2042
dword-значение цвета 0x00RRGGBB
2042
  * +0: dword: frames - цвет рамки
2043
  * +0: dword: frames - цвет рамки
2043
  * +4: dword: grab - цвет заголовка
2044
  * +4: dword: grab - цвет заголовка
2044
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
2045
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
2045
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
2046
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
2046
    на полосе заголовка
2047
    на полосе заголовка
2047
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2048
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2048
  * +20 = +0x14: dword: work - цвет рабочей области
2049
  * +20 = +0x14: dword: work - цвет рабочей области
2049
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
2050
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
2050
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
2051
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
2051
    в рабочей области
2052
    в рабочей области
2052
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
2053
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
2053
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
2054
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
2054
Замечания:
2055
Замечания:
2055
  * Структура таблицы цветов описана в стандартном включаемом файле
2056
  * Структура таблицы цветов описана в стандартном включаемом файле
2056
    macros.inc под названием system_colors; например, можно писать:
2057
    macros.inc под названием system_colors; например, можно писать:
2057
    	sc	system_colors		; объявление переменной
2058
    	sc	system_colors		; объявление переменной
2058
    	...				; где-то надо вызвать
2059
    	...				; где-то надо вызвать
2059
    					; описываемую функцию с ecx=sc
2060
    					; описываемую функцию с ecx=sc
2060
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
2061
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
2061
    					; на кнопке в рабочей области
2062
    					; на кнопке в рабочей области
2062
  * Использование/неиспользование этих цветов - дело исключительно
2063
  * Использование/неиспользование этих цветов - дело исключительно
2063
    самой программы. Для использования нужно просто при вызове функций
2064
    самой программы. Для использования нужно просто при вызове функций
2064
    рисования указывать цвет, взятый из этой таблицы.
2065
    рисования указывать цвет, взятый из этой таблицы.
2065
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2066
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2066
    последующим применением изменений подфункцией 0 или
2067
    последующим применением изменений подфункцией 0 или
2067
    при установке скина подфункцией 8) всем окнам посылается сообщение
2068
    при установке скина подфункцией 8) всем окнам посылается сообщение
2068
    о необходимости перерисовки (событие с кодом 1).
2069
    о необходимости перерисовки (событие с кодом 1).
2069
  * Стандартные цвета можно просматривать/изменять интерактивно
2070
  * Стандартные цвета можно просматривать/изменять интерактивно
2070
    с помощью приложения desktop.
2071
    с помощью приложения desktop.
2071
 
2072
 
2072
======================================================================
2073
======================================================================
2073
========== Функция 48, подфункция 4 - получить высоту скина. =========
2074
========== Функция 48, подфункция 4 - получить высоту скина. =========
2074
======================================================================
2075
======================================================================
2075
Параметры:
2076
Параметры:
2076
  * eax = 48 - номер функции
2077
  * eax = 48 - номер функции
2077
  * ebx = 4 - номер подфункции
2078
  * ebx = 4 - номер подфункции
2078
Возвращаемое значение:
2079
Возвращаемое значение:
2079
  * eax = высота скина
2080
  * eax = высота скина
2080
Замечания:
2081
Замечания:
2081
  * Высотой скина по определению считается высота заголовка окон,
2082
  * Высотой скина по определению считается высота заголовка окон,
2082
    использующих скин.
2083
    использующих скин.
2083
  * Смотри также общую структуру окна в описании функции 0.
2084
  * Смотри также общую структуру окна в описании функции 0.
2084
 
2085
 
2085
======================================================================
2086
======================================================================
2086
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
2087
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
2087
======================================================================
2088
======================================================================
2088
Параметры:
2089
Параметры:
2089
  * eax = 48 - номер функции
2090
  * eax = 48 - номер функции
2090
  * ebx = 5 - номер подфункции
2091
  * ebx = 5 - номер подфункции
2091
Возвращаемое значение:
2092
Возвращаемое значение:
2092
  * eax = [left]*65536 + [right]
2093
  * eax = [left]*65536 + [right]
2093
  * ebx = [top]*65536 + [bottom]
2094
  * ebx = [top]*65536 + [bottom]
2094
Замечания:
2095
Замечания:
2095
  * Рабочая область экрана определяет положение и координаты
2096
  * Рабочая область экрана определяет положение и координаты
2096
    максимизированного окна.
2097
    максимизированного окна.
2097
  * Рабочая область экрана при нормальной работе есть весь экран
2098
  * Рабочая область экрана при нормальной работе есть весь экран
2098
    за вычетом панели (@taskbar).
2099
    за вычетом панели (@taskbar).
2099
  * (left,top) - координаты левого верхнего угла,
2100
  * (left,top) - координаты левого верхнего угла,
2100
    (right,bottom) - координаты правого нижнего.
2101
    (right,bottom) - координаты правого нижнего.
2101
    Таким образом, размер рабочей области по оси x определяется
2102
    Таким образом, размер рабочей области по оси x определяется
2102
    формулой right-left+1, по оси y - формулой bottom-right+1.
2103
    формулой right-left+1, по оси y - формулой bottom-right+1.
2103
  * Смотри также функцию 14,
2104
  * Смотри также функцию 14,
2104
    позволяющую определить размеры всего экрана.
2105
    позволяющую определить размеры всего экрана.
2105
  * Есть парная функция установки рабочей области - подфункция 6.
2106
  * Есть парная функция установки рабочей области - подфункция 6.
2106
 
2107
 
2107
======================================================================
2108
======================================================================
2108
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
2109
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
2109
======================================================================
2110
======================================================================
2110
Параметры:
2111
Параметры:
2111
  * eax = 48 - номер функции
2112
  * eax = 48 - номер функции
2112
  * ebx = 6 - номер подфункции
2113
  * ebx = 6 - номер подфункции
2113
  * ecx = [left]*65536 + [right]
2114
  * ecx = [left]*65536 + [right]
2114
  * edx = [top]*65536 + [bottom]
2115
  * edx = [top]*65536 + [bottom]
2115
Возвращаемое значение:
2116
Возвращаемое значение:
2116
  * функция не возвращает значения
2117
  * функция не возвращает значения
2117
Замечания:
2118
Замечания:
2118
  * Рабочая область экрана определяет положение и координаты
2119
  * Рабочая область экрана определяет положение и координаты
2119
    максимизированного окна.
2120
    максимизированного окна.
2120
  * Эта функция используется только приложением @taskbar,
2121
  * Эта функция используется только приложением @taskbar,
2121
    устанавливающим рабочей областью весь экран за вычетом панели.
2122
    устанавливающим рабочей областью весь экран за вычетом панели.
2122
  * (left,top) - координаты левого верхнего угла,
2123
  * (left,top) - координаты левого верхнего угла,
2123
    (right,bottom) - координаты правого нижнего.
2124
    (right,bottom) - координаты правого нижнего.
2124
    Таким образом, размер рабочей области по оси x определяется
2125
    Таким образом, размер рабочей области по оси x определяется
2125
    формулой right-left+1, по оси y - формулой bottom-right+1.
2126
    формулой right-left+1, по оси y - формулой bottom-right+1.
2126
  * Если left>=right, то x-координаты рабочей области не изменяются.
2127
  * Если left>=right, то x-координаты рабочей области не изменяются.
2127
    Если left<0, то left не устанавливается. Если right больше
2128
    Если left<0, то left не устанавливается. Если right больше
2128
    или равно ширины экрана, то right не устанавливается.
2129
    или равно ширины экрана, то right не устанавливается.
2129
    Аналогично по оси y.
2130
    Аналогично по оси y.
2130
  * Смотри также функцию 14,
2131
  * Смотри также функцию 14,
2131
    позволяющую определить размеры всего экрана.
2132
    позволяющую определить размеры всего экрана.
2132
  * Есть парная функция получения рабочей области -
2133
  * Есть парная функция получения рабочей области -
2133
    подфункция 5.
2134
    подфункция 5.
2134
  * Эта функция автоматически перерисовывает экран, по ходу дела
2135
  * Эта функция автоматически перерисовывает экран, по ходу дела
2135
    обновляет координаты и размеры максимизированных окон.
2136
    обновляет координаты и размеры максимизированных окон.
2136
    Все окна извещаются о необходимости перерисовки (событие 1).
2137
    Все окна извещаются о необходимости перерисовки (событие 1).
2137
 
2138
 
2138
======================================================================
2139
======================================================================
2139
====================== Функция 48, подфункция 7 ======================
2140
====================== Функция 48, подфункция 7 ======================
2140
============ Получить область скина для текста заголовка. ============
2141
============ Получить область скина для текста заголовка. ============
2141
======================================================================
2142
======================================================================
2142
Возвращает область заголовка окна со скином, предназначенную
2143
Возвращает область заголовка окна со скином, предназначенную
2143
для вывода текста заголовка.
2144
для вывода текста заголовка.
2144
Параметры:
2145
Параметры:
2145
  * eax = 48 - номер функции
2146
  * eax = 48 - номер функции
2146
  * ebx = 7 - номер подфункции
2147
  * ebx = 7 - номер подфункции
2147
Возвращаемое значение:
2148
Возвращаемое значение:
2148
  * eax = [left]*65536 + [right]
2149
  * eax = [left]*65536 + [right]
2149
  * ebx = [top]*65536 + [bottom]
2150
  * ebx = [top]*65536 + [bottom]
2150
Замечания:
2151
Замечания:
2151
  * Использование/неиспользование этой функции -
2152
  * Использование/неиспользование этой функции -
2152
    личное дело приложения.
2153
    личное дело приложения.
2153
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2154
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2154
    при выборе места для рисования текста заголовка (функцией 4) или
2155
    при выборе места для рисования текста заголовка (функцией 4) или
2155
    какого-нибудь заменителя текста заголовка
2156
    какого-нибудь заменителя текста заголовка
2156
    (по усмотрению приложения).
2157
    (по усмотрению приложения).
2157
 
2158
 
2158
======================================================================
2159
======================================================================
2159
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
2160
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
2160
======================================================================
2161
======================================================================
2161
Параметры:
2162
Параметры:
2162
  * eax = 48 - номер функции
2163
  * eax = 48 - номер функции
2163
  * ebx = 8 - номер подфункции
2164
  * ebx = 8 - номер подфункции
2164
  * ecx = указатель на имя файла скина
2165
  * ecx = указатель на имя файла скина
2165
Возвращаемое значение:
2166
Возвращаемое значение:
2166
  * eax = 0 - успешно
2167
  * eax = 0 - успешно
2167
  * eax = 1 - не удалось загрузить файл
2168
  * eax = 1 - не удалось загрузить файл
2168
  * eax = 2 - файл не является файлом скина
2169
  * eax = 2 - файл не является файлом скина
2169
Замечания:
2170
Замечания:
2170
  * При успешной загрузке скина все окна извещаются о необходимости
2171
  * При успешной загрузке скина все окна извещаются о необходимости
2171
    перерисовки (событие 1).
2172
    перерисовки (событие 1).
2172
  * При загрузке система считывает скин из файла default.skn
2173
  * При загрузке система считывает скин из файла default.skn
2173
    на рамдиске.
2174
    на рамдиске.
2174
  * Пользователь может изменять скин статически, создав свой
2175
  * Пользователь может изменять скин статически, создав свой
2175
    default.skn, или динамически с помощью приложения desktop.
2176
    default.skn, или динамически с помощью приложения desktop.
2176
 
2177
 
2177
======================================================================
2178
======================================================================
2178
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
2179
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
2179
======================================================================
2180
======================================================================
2180
Параметры:
2181
Параметры:
2181
  * eax = 48 - номер функции
2182
  * eax = 48 - номер функции
2182
  * ebx = 9 - номер подфункции
2183
  * ebx = 9 - номер подфункции
2183
Возвращаемое значение:
2184
Возвращаемое значение:
2184
  * eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
2185
  * eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
2185
 
2186
 
2186
======================================================================
2187
======================================================================
2187
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
2188
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
2188
======================================================================
2189
======================================================================
2189
Параметры:
2190
Параметры:
2190
  * eax = 48 - номер функции
2191
  * eax = 48 - номер функции
2191
  * ebx = 10 - номер подфункции
2192
  * ebx = 10 - номер подфункции
2192
  * cl  = 2 - субпиксельное, 1 - обычное, 0 - выключить
2193
  * cl  = 2 - субпиксельное, 1 - обычное, 0 - выключить
-
 
2194
 
-
 
2195
======================================================================
-
 
2196
======== Функция 48, подфункция 11 - получить размер шрифтов. ========
-
 
2197
======================================================================
-
 
2198
Параметры:
-
 
2199
  * eax = 48 - номер функции
-
 
2200
  * ebx = 9 - номер подфункции
-
 
2201
Возвращаемое значение:
-
 
2202
  * eax = текущая высота шрифта в пикселях
-
 
2203
 
-
 
2204
======================================================================
-
 
2205
======= Функция 48, подфункция 12 - установить размер шрифтов. =======
-
 
2206
======================================================================
-
 
2207
Параметры:
-
 
2208
  * eax = 48 - номер функции
-
 
2209
  * ebx = 10 - номер подфункции
-
 
2210
  * cl  = новая высота шрифта в пикселях
2193
 
2211
 
2194
======================================================================
2212
======================================================================
2195
============ Функция 49 - Advanced Power Management (APM). ===========
2213
============ Функция 49 - Advanced Power Management (APM). ===========
2196
======================================================================
2214
======================================================================
2197
Параметры:
2215
Параметры:
2198
  * eax = 49 - номер функции
2216
  * eax = 49 - номер функции
2199
  * dx = номер функции APM (аналог ax в спецификации)
2217
  * dx = номер функции APM (аналог ax в спецификации)
2200
  * bx, cx = параметры функции APM
2218
  * bx, cx = параметры функции APM
2201
Возвращаемое значение:
2219
Возвращаемое значение:
2202
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2220
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2203
    установлены в соответствии со спецификацией APM
2221
    установлены в соответствии со спецификацией APM
2204
  * старшие половины 32-битных регистров eax, ebx, ecx,
2222
  * старшие половины 32-битных регистров eax, ebx, ecx,
2205
    edx, esi, edi разрушаются
2223
    edx, esi, edi разрушаются
2206
Замечания:
2224
Замечания:
2207
  * Спецификация APM 1.2 описывается в документе
2225
  * Спецификация APM 1.2 описывается в документе
2208
    "Advanced Power Management (APM) BIOS Specification"
2226
    "Advanced Power Management (APM) BIOS Specification"
2209
    (Revision 1.2), доступном на
2227
    (Revision 1.2), доступном на
2210
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2228
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2211
    кроме того, она включена в известный Interrupt List by Ralf Brown
2229
    кроме того, она включена в известный Interrupt List by Ralf Brown
2212
    (http://www.pobox.com/~ralf/files.html,
2230
    (http://www.pobox.com/~ralf/files.html,
2213
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2231
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2214
 
2232
 
2215
======================================================================
2233
======================================================================
2216
================= Функция 50 - установка формы окна. =================
2234
================= Функция 50 - установка формы окна. =================
2217
======================================================================
2235
======================================================================
2218
Обычные окна представляют собой прямоугольники. С помощью этой функции
2236
Обычные окна представляют собой прямоугольники. С помощью этой функции
2219
окну можно придать произвольную форму. Форма задаётся набором точек
2237
окну можно придать произвольную форму. Форма задаётся набором точек
2220
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2238
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2221
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2239
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2222
функцией 67.
2240
функцией 67.
2223
 
2241
 
2224
--------------- Установка данных с информацией о форме ---------------
2242
--------------- Установка данных с информацией о форме ---------------
2225
Параметры:
2243
Параметры:
2226
  * eax = 50 - номер функции
2244
  * eax = 50 - номер функции
2227
  * ebx = 0 - номер подфункции
2245
  * ebx = 0 - номер подфункции
2228
  * ecx = указатель на данные формы (массив байт 0/1)
2246
  * ecx = указатель на данные формы (массив байт 0/1)
2229
Возвращаемое значение:
2247
Возвращаемое значение:
2230
  * функция не возвращает значения
2248
  * функция не возвращает значения
2231
 
2249
 
2232
------------------ Установка масштаба данных формы -------------------
2250
------------------ Установка масштаба данных формы -------------------
2233
Параметры:
2251
Параметры:
2234
  * eax = 50 - номер функции
2252
  * eax = 50 - номер функции
2235
  * ebx = 1 - номер подфункции
2253
  * ebx = 1 - номер подфункции
2236
  * ecx задаёт масштаб: каждый байт данных определяет
2254
  * ecx задаёт масштаб: каждый байт данных определяет
2237
    (2^scale)*(2^scale) пикселей
2255
    (2^scale)*(2^scale) пикселей
2238
Возвращаемое значение:
2256
Возвращаемое значение:
2239
  * функция не возвращает значения
2257
  * функция не возвращает значения
2240
Замечания:
2258
Замечания:
2241
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2259
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2242
    данных формы один байт соответствует одному пикселю, то масштаб
2260
    данных формы один байт соответствует одному пикселю, то масштаб
2243
    можно не устанавливать.
2261
    можно не устанавливать.
2244
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2262
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2245
    обратите внимание, что они на единицу больше, чем устанавливаемые
2263
    обратите внимание, что они на единицу больше, чем устанавливаемые
2246
    функциями 0, 67.
2264
    функциями 0, 67.
2247
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2265
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2248
  * Байт данных по смещению a должен быть 0/1 и
2266
  * Байт данных по смещению a должен быть 0/1 и
2249
    определяет принадлежность окну квадрата со стороной 2^scale
2267
    определяет принадлежность окну квадрата со стороной 2^scale
2250
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
2268
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
2251
    (a mod (xsize shr scale), a div (xsize shr scale))
2269
    (a mod (xsize shr scale), a div (xsize shr scale))
2252
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2270
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2253
  * Данные должны присутствовать в памяти и не меняться
2271
  * Данные должны присутствовать в памяти и не меняться
2254
    после установки формы.
2272
    после установки формы.
2255
  * Система просматривает данные о форме при каждой перерисовке окна
2273
  * Система просматривает данные о форме при каждой перерисовке окна
2256
    функцией 0.
2274
    функцией 0.
2257
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2275
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2258
    к прямоугольной форме.
2276
    к прямоугольной форме.
2259
 
2277
 
2260
======================================================================
2278
======================================================================
2261
===================== Функция 51 - создать поток. ====================
2279
===================== Функция 51 - создать поток. ====================
2262
======================================================================
2280
======================================================================
2263
Параметры:
2281
Параметры:
2264
  * eax = 51 - номер функции
2282
  * eax = 51 - номер функции
2265
  * ebx = 1 - единственная подфункция
2283
  * ebx = 1 - единственная подфункция
2266
  * ecx = адрес точки входа потока (начальный eip)
2284
  * ecx = адрес точки входа потока (начальный eip)
2267
  * edx = указатель стэка потока (начальный esp)
2285
  * edx = указатель стэка потока (начальный esp)
2268
Возвращаемое значение:
2286
Возвращаемое значение:
2269
  * eax = -1 - ошибка (в системе слишком много потоков)
2287
  * eax = -1 - ошибка (в системе слишком много потоков)
2270
  * иначе eax = TID - идентификатор потока
2288
  * иначе eax = TID - идентификатор потока
2271
 
2289
 
2272
======================================================================
2290
======================================================================
2273
====================== Функция 54, подфункция 0 ======================
2291
====================== Функция 54, подфункция 0 ======================
2274
============== Узнать количество слотов в буфере обмена. =============
2292
============== Узнать количество слотов в буфере обмена. =============
2275
======================================================================
2293
======================================================================
2276
Параметры:
2294
Параметры:
2277
  * eax = 54 - номер функции
2295
  * eax = 54 - номер функции
2278
  * ebx = 0 - номер подфункции
2296
  * ebx = 0 - номер подфункции
2279
Возвращаемое значение:
2297
Возвращаемое значение:
2280
  * eax = количество слотов в буфере 
2298
  * eax = количество слотов в буфере 
2281
  * eax = -1 - отсутствует область главного списка
2299
  * eax = -1 - отсутствует область главного списка
2282
 
2300
 
2283
======================================================================
2301
======================================================================
2284
====================== Функция 54, подфункция 1 ======================
2302
====================== Функция 54, подфункция 1 ======================
2285
================== Считать данные из буфера обмена. ==================
2303
================== Считать данные из буфера обмена. ==================
2286
======================================================================
2304
======================================================================
2287
Параметры:
2305
Параметры:
2288
  * eax = 54 - номер функции
2306
  * eax = 54 - номер функции
2289
  * ebx = 1 - номер подфункции
2307
  * ebx = 1 - номер подфункции
2290
  * eсx = номер слота
2308
  * eсx = номер слота
2291
Возвращаемое значение:
2309
Возвращаемое значение:
2292
  * eax = если успешно - указатель на область памяти с данными
2310
  * eax = если успешно - указатель на область памяти с данными
2293
  * eax = 1 - ошибка
2311
  * eax = 1 - ошибка
2294
  * eax = -1 - отсутствует область главного списка
2312
  * eax = -1 - отсутствует область главного списка
2295
 
2313
 
2296
======================================================================
2314
======================================================================
2297
====================== Функция 54, подфункция 2 ======================
2315
====================== Функция 54, подфункция 2 ======================
2298
================== Записать данные в буфер обмена. ===================
2316
================== Записать данные в буфер обмена. ===================
2299
======================================================================
2317
======================================================================
2300
Параметры:
2318
Параметры:
2301
  * eax = 54 - номер функции
2319
  * eax = 54 - номер функции
2302
  * ebx = 2 - номер подфункции
2320
  * ebx = 2 - номер подфункции
2303
  * eсx = количество копируемых байт
2321
  * eсx = количество копируемых байт
2304
  * edx = указатель на буфер под копируемые данные
2322
  * edx = указатель на буфер под копируемые данные
2305
Возвращаемое значение:
2323
Возвращаемое значение:
2306
  * eax = 0 - успешно
2324
  * eax = 0 - успешно
2307
  * eax = 1 - ошибка
2325
  * eax = 1 - ошибка
2308
  * eax = -1 - отсутствует область главного списка
2326
  * eax = -1 - отсутствует область главного списка
2309
 
2327
 
2310
======================================================================
2328
======================================================================
2311
====================== Функция 54, подфункция 3 ======================
2329
====================== Функция 54, подфункция 3 ======================
2312
========= Удалить последний слот с данными в буфере обмена ===========
2330
========= Удалить последний слот с данными в буфере обмена ===========
2313
======================================================================
2331
======================================================================
2314
Параметры:
2332
Параметры:
2315
  * eax = 54 - номер функции
2333
  * eax = 54 - номер функции
2316
  * ebx = 3 - номер подфункции
2334
  * ebx = 3 - номер подфункции
2317
Возвращаемое значение:
2335
Возвращаемое значение:
2318
  * eax = 0 - успешно
2336
  * eax = 0 - успешно
2319
  * eax = 1 - ошибка
2337
  * eax = 1 - ошибка
2320
  * eax = -1 - отсутствует область главного списка
2338
  * eax = -1 - отсутствует область главного списка
2321
 
2339
 
2322
======================================================================
2340
======================================================================
2323
====================== Функция 54, подфункция 4 ======================
2341
====================== Функция 54, подфункция 4 ======================
2324
=================== Аварийный сброс блокировки буфера ================
2342
=================== Аварийный сброс блокировки буфера ================
2325
======================================================================
2343
======================================================================
2326
Параметры:
2344
Параметры:
2327
  * eax = 54 - номер функции
2345
  * eax = 54 - номер функции
2328
  * ebx = 4 - номер подфункции
2346
  * ebx = 4 - номер подфункции
2329
Возвращаемое значение:
2347
Возвращаемое значение:
2330
  * eax = 0 - успешно
2348
  * eax = 0 - успешно
2331
  * eax = -1 - отсутствует область главного списка или нет блокировки
2349
  * eax = -1 - отсутствует область главного списка или нет блокировки
2332
Замечания:
2350
Замечания:
2333
  * Используется в исключительных случаях, когда зависшее или убитое
2351
  * Используется в исключительных случаях, когда зависшее или убитое
2334
    приложение заблокировало работу с буфером обмена.
2352
    приложение заблокировало работу с буфером обмена.
2335
 
2353
 
2336
======================================================================
2354
======================================================================
2337
====================== Функция 55, подфункция 55 =====================
2355
====================== Функция 55, подфункция 55 =====================
2338
========== Начать проигрывать данные на встроенном спикере. ==========
2356
========== Начать проигрывать данные на встроенном спикере. ==========
2339
======================================================================
2357
======================================================================
2340
Параметры:
2358
Параметры:
2341
  * eax = 55 - номер функции
2359
  * eax = 55 - номер функции
2342
  * ebx = 55 - номер подфункции
2360
  * ebx = 55 - номер подфункции
2343
  * esi = указатель на данные
2361
  * esi = указатель на данные
2344
Возвращаемое значение:
2362
Возвращаемое значение:
2345
  * eax = 0 - успешно
2363
  * eax = 0 - успешно
2346
  * eax = 55 - ошибка (спикер отключён или занят)
2364
  * eax = 55 - ошибка (спикер отключён или занят)
2347
Данные - это массив элементов переменной длины.
2365
Данные - это массив элементов переменной длины.
2348
Формат каждого элемента определяется первым байтом:
2366
Формат каждого элемента определяется первым байтом:
2349
  * 0 = конец данных
2367
  * 0 = конец данных
2350
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2368
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2351
    ноты, определяемой непосредственным значением частоты
2369
    ноты, определяемой непосредственным значением частоты
2352
    * следующее слово (2 байта) содержит делитель частоты;
2370
    * следующее слово (2 байта) содержит делитель частоты;
2353
      частота определяется как 1193180/divider
2371
      частота определяется как 1193180/divider
2354
  * 0x81 = invalid
2372
  * 0x81 = invalid
2355
  * 0x82..0xFF = нота, определяемая октавой и номером:
2373
  * 0x82..0xFF = нота, определяемая октавой и номером:
2356
    * длительность в сотых долях секунды = (первый байт)-0x81
2374
    * длительность в сотых долях секунды = (первый байт)-0x81
2357
    * присутствует ещё один байт;
2375
    * присутствует ещё один байт;
2358
    * (второй байт)=0xFF - пауза
2376
    * (второй байт)=0xFF - пауза
2359
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2377
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2360
      до 12, a=номер октавы (считая с 0)
2378
      до 12, a=номер октавы (считая с 0)
2361
Замечания:
2379
Замечания:
2362
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2380
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2363
    функции 18.
2381
    функции 18.
2364
  * Функция возвращает управление, сообщив куда следует информацию
2382
  * Функция возвращает управление, сообщив куда следует информацию
2365
    о запросе. Само проигрывание идёт независимо от программы.
2383
    о запросе. Само проигрывание идёт независимо от программы.
2366
  * Данные должны сохраняться в памяти по крайней мере
2384
  * Данные должны сохраняться в памяти по крайней мере
2367
    до конца проигрывания.
2385
    до конца проигрывания.
2368
 
2386
 
2369
======================================================================
2387
======================================================================
2370
======================= Функция 57 - PCI BIOS. =======================
2388
======================= Функция 57 - PCI BIOS. =======================
2371
======================================================================
2389
======================================================================
2372
Параметры:
2390
Параметры:
2373
  * eax = 57 - номер функции
2391
  * eax = 57 - номер функции
2374
  * ebp соответствует регистру al в спецификации PCI BIOS
2392
  * ebp соответствует регистру al в спецификации PCI BIOS
2375
  * остальные регистры - по спецификации PCI BIOS
2393
  * остальные регистры - по спецификации PCI BIOS
2376
Возвращаемое значение:
2394
Возвращаемое значение:
2377
  * CF не определён
2395
  * CF не определён
2378
  * остальные регистры - по спецификации PCI BIOS
2396
  * остальные регистры - по спецификации PCI BIOS
2379
Замечания:
2397
Замечания:
2380
  * Многих результатов этой функции можно также добиться вызовом
2398
  * Многих результатов этой функции можно также добиться вызовом
2381
    соответствующих подфункций функции 62.
2399
    соответствующих подфункций функции 62.
2382
  * Функция вызывает расширение PCI32 BIOS, документированное,
2400
  * Функция вызывает расширение PCI32 BIOS, документированное,
2383
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2401
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2384
  * Если BIOS не поддерживает это расширение, поведение функции
2402
  * Если BIOS не поддерживает это расширение, поведение функции
2385
    эмулируется (через аналоги подфункций функции 62 режима ядра).
2403
    эмулируется (через аналоги подфункций функции 62 режима ядра).
2386
 
2404
 
2387
======================================================================
2405
======================================================================
2388
=========== Функция 60 - Inter Process Communication (IPC). ==========
2406
=========== Функция 60 - Inter Process Communication (IPC). ==========
2389
======================================================================
2407
======================================================================
2390
IPC применяется для посылок сообщений от одного процесса/потока
2408
IPC применяется для посылок сообщений от одного процесса/потока
2391
другому. При этом следует предварительно договориться о том, как
2409
другому. При этом следует предварительно договориться о том, как
2392
интерпретировать конкретное сообщение.
2410
интерпретировать конкретное сообщение.
2393
 
2411
 
2394
-------- Подфункция 1 - установить область для получения IPC ---------
2412
-------- Подфункция 1 - установить область для получения IPC ---------
2395
Вызывается процессом-приёмником.
2413
Вызывается процессом-приёмником.
2396
Параметры:
2414
Параметры:
2397
  * eax = 60 - номер функции
2415
  * eax = 60 - номер функции
2398
  * ebx = 1 - номер подфункции
2416
  * ebx = 1 - номер подфункции
2399
  * ecx = указатель на буфер
2417
  * ecx = указатель на буфер
2400
  * edx = размер буфера
2418
  * edx = размер буфера
2401
Возвращаемое значение:
2419
Возвращаемое значение:
2402
  * eax = 0 - всегда успешно
2420
  * eax = 0 - всегда успешно
2403
Формат IPC-буфера:
2421
Формат IPC-буфера:
2404
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2422
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2405
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2423
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2406
    и вам надо, чтобы извне не изменялись данные буфера
2424
    и вам надо, чтобы извне не изменялись данные буфера
2407
    (не поступали новые сообщения)
2425
    (не поступали новые сообщения)
2408
  * +4: dword: занято места в буфере (в байтах)
2426
  * +4: dword: занято места в буфере (в байтах)
2409
  * +8: первое сообщение
2427
  * +8: первое сообщение
2410
  * +8+n: второе сообщение
2428
  * +8+n: второе сообщение
2411
  * ...
2429
  * ...
2412
Формат сообщения:
2430
Формат сообщения:
2413
  * +0: dword: PID процесса/потока, пославшего сообщение
2431
  * +0: dword: PID процесса/потока, пославшего сообщение
2414
  * +4: dword: длина сообщения (не считая этот заголовок)
2432
  * +4: dword: длина сообщения (не считая этот заголовок)
2415
  * +8: n*byte: данные сообщения
2433
  * +8: n*byte: данные сообщения
2416
 
2434
 
2417
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2435
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2418
Вызывается процессом-инициатором.
2436
Вызывается процессом-инициатором.
2419
Параметры:
2437
Параметры:
2420
  * eax = 60 - номер функции
2438
  * eax = 60 - номер функции
2421
  * ebx = 2 - номер подфункции
2439
  * ebx = 2 - номер подфункции
2422
  * ecx = PID приёмника
2440
  * ecx = PID приёмника
2423
  * edx = указатель на данные сообщения
2441
  * edx = указатель на данные сообщения
2424
  * esi = длина сообщения (в байтах)
2442
  * esi = длина сообщения (в байтах)
2425
Возвращаемое значение:
2443
Возвращаемое значение:
2426
  * eax = 0 - успешно
2444
  * eax = 0 - успешно
2427
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2445
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2428
    (может быть, ещё не успел, а может быть, это не тот поток,
2446
    (может быть, ещё не успел, а может быть, это не тот поток,
2429
    который нужен)
2447
    который нужен)
2430
  * eax = 2 - приёмник заблокировал IPC-буфер;
2448
  * eax = 2 - приёмник заблокировал IPC-буфер;
2431
    попробуйте немного подождать
2449
    попробуйте немного подождать
2432
  * eax = 3 - переполнение IPC-буфера приёмника
2450
  * eax = 3 - переполнение IPC-буфера приёмника
2433
  * eax = 4 - процесса/потока с таким PID не существует
2451
  * eax = 4 - процесса/потока с таким PID не существует
2434
Замечания:
2452
Замечания:
2435
  * Система сразу после записи IPC-сообщения в буфер посылает
2453
  * Система сразу после записи IPC-сообщения в буфер посылает
2436
    потоку-приёмнику событие с кодом 7 (см. коды событий).
2454
    потоку-приёмнику событие с кодом 7 (см. коды событий).
2437
 
2455
 
2438
======================================================================
2456
======================================================================
2439
=== Функция 61 - получить параметры для прямого доступа к графике. ===
2457
=== Функция 61 - получить параметры для прямого доступа к графике. ===
2440
======================================================================
2458
======================================================================
2441
Программе доступны данные графического экрана (область памяти, которая
2459
Программе доступны данные графического экрана (область памяти, которая
2442
собственно и отображает содержимое экрана) напрямую без вызовов
2460
собственно и отображает содержимое экрана) напрямую без вызовов
2443
системных функций через селектор gs:
2461
системных функций через селектор gs:
2444
	mov	eax, [gs:0]
2462
	mov	eax, [gs:0]
2445
поместит в eax первый dword буфера, содержащий информацию о цвете
2463
поместит в eax первый dword буфера, содержащий информацию о цвете
2446
левой верхней точки (и, возможно, цвета нескольких следующих).
2464
левой верхней точки (и, возможно, цвета нескольких следующих).
2447
	mov	[gs:0], eax
2465
	mov	[gs:0], eax
2448
при работе в режимах VESA c LFB
2466
при работе в режимах VESA c LFB
2449
установит цвет левой верхней точки
2467
установит цвет левой верхней точки
2450
(и возможно, цвета нескольких следующих).
2468
(и возможно, цвета нескольких следующих).
2451
Для интерпретации данных графического экрана требуется знание
2469
Для интерпретации данных графического экрана требуется знание
2452
некоторых параметров, которые возвращаются этой функцией.
2470
некоторых параметров, которые возвращаются этой функцией.
2453
Замечания:
2471
Замечания:
2454
  * Параметры графики очень редко меняются при работе системы,
2472
  * Параметры графики очень редко меняются при работе системы,
2455
    а именно, только в случаях, когда пользователь работает
2473
    а именно, только в случаях, когда пользователь работает
2456
    с программой VRR.
2474
    с программой VRR.
2457
  * При изменении видеорежима система перерисовывает все окна
2475
  * При изменении видеорежима система перерисовывает все окна
2458
    (событие с кодом 1) и перерисовывает фон (событие 5).
2476
    (событие с кодом 1) и перерисовывает фон (событие 5).
2459
    Эти же события происходят и в других случаях,
2477
    Эти же события происходят и в других случаях,
2460
    которые встречаются значительно чаще, чем изменение видеорежима.
2478
    которые встречаются значительно чаще, чем изменение видеорежима.
2461
  * При работе в видеорежимах с LFB селектор gs указывает на
2479
  * При работе в видеорежимах с LFB селектор gs указывает на
2462
    собственно LFB, так что чтение/запись по gs приводят
2480
    собственно LFB, так что чтение/запись по gs приводят
2463
    непосредственно к изменению содержимого экрана. При работе в
2481
    непосредственно к изменению содержимого экрана. При работе в
2464
    видеорежимах без LFB gs указывает на некоторую область данных
2482
    видеорежимах без LFB gs указывает на некоторую область данных
2465
    ядра, причём все функции вывода на экран добросовестно выполняют
2483
    ядра, причём все функции вывода на экран добросовестно выполняют
2466
    двойную работу по записи непосредственно на экран и по записи
2484
    двойную работу по записи непосредственно на экран и по записи
2467
    в этот буфер. В результате при чтении содержимого этого буфера
2485
    в этот буфер. В результате при чтении содержимого этого буфера
2468
    результаты соответствуют содержимому экрана
2486
    результаты соответствуют содержимому экрана
2469
    (с, вообще говоря, большим цветовым разрешением),
2487
    (с, вообще говоря, большим цветовым разрешением),
2470
    а запись игнорируется.
2488
    а запись игнорируется.
2471
    Исключением является режим 320*200, для которого в главном цикле
2489
    Исключением является режим 320*200, для которого в главном цикле
2472
    системного потока выполняется обновление экрана в соответствии
2490
    системного потока выполняется обновление экрана в соответствии
2473
    с движениями курсора мыши.
2491
    с движениями курсора мыши.
2474
 
2492
 
2475
------------------------- Разрешение экрана --------------------------
2493
------------------------- Разрешение экрана --------------------------
2476
Параметры:
2494
Параметры:
2477
  * eax = 61 - номер функции
2495
  * eax = 61 - номер функции
2478
  * ebx = 1 - номер подфункции
2496
  * ebx = 1 - номер подфункции
2479
Возвращаемое значение:
2497
Возвращаемое значение:
2480
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2498
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2481
Замечания:
2499
Замечания:
2482
  * Можно использовать функцию 14 с учётом того, что она возвращает
2500
  * Можно использовать функцию 14 с учётом того, что она возвращает
2483
    размеры на 1 меньше. Это полностью эквивалентный способ.
2501
    размеры на 1 меньше. Это полностью эквивалентный способ.
2484
 
2502
 
2485
------------------------ Число бит на пиксель ------------------------
2503
------------------------ Число бит на пиксель ------------------------
2486
Параметры:
2504
Параметры:
2487
  * eax = 61 - номер функции
2505
  * eax = 61 - номер функции
2488
  * ebx = 2 - номер подфункции
2506
  * ebx = 2 - номер подфункции
2489
Возвращаемое значение:
2507
Возвращаемое значение:
2490
  * eax = число бит на пиксель (24 или 32)
2508
  * eax = число бит на пиксель (24 или 32)
2491
 
2509
 
2492
------------------------ Число байт на строку ------------------------
2510
------------------------ Число байт на строку ------------------------
2493
Параметры:
2511
Параметры:
2494
  * eax = 61 - номер функции
2512
  * eax = 61 - номер функции
2495
  * ebx = 3 - номер подфункции
2513
  * ebx = 3 - номер подфункции
2496
Возвращаемое значение:
2514
Возвращаемое значение:
2497
  * eax = число байт, которое занимает одна строка развёртки
2515
  * eax = число байт, которое занимает одна строка развёртки
2498
    (горизонтальная линия на экране)
2516
    (горизонтальная линия на экране)
2499
 
2517
 
2500
======================================================================
2518
======================================================================
2501
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
2519
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
2502
======================================================================
2520
======================================================================
2503
Параметры:
2521
Параметры:
2504
  * eax = 62 - номер функции
2522
  * eax = 62 - номер функции
2505
  * bl = 0 - номер подфункции
2523
  * bl = 0 - номер подфункции
2506
Возвращаемое значение:
2524
Возвращаемое значение:
2507
  * eax = -1 - доступ к PCI запрещён; иначе
2525
  * eax = -1 - доступ к PCI запрещён; иначе
2508
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2526
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2509
  * старшее слово eax обнулено
2527
  * старшее слово eax обнулено
2510
Замечания:
2528
Замечания:
2511
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2529
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2512
    для приложений подфункцией 12 функции 21.
2530
    для приложений подфункцией 12 функции 21.
2513
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
2531
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
2514
 
2532
 
2515
======================================================================
2533
======================================================================
2516
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
2534
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
2517
======================================================================
2535
======================================================================
2518
Параметры:
2536
Параметры:
2519
  * eax = 62 - номер функции
2537
  * eax = 62 - номер функции
2520
  * bl = 1 - номер подфункции
2538
  * bl = 1 - номер подфункции
2521
Возвращаемое значение:
2539
Возвращаемое значение:
2522
  * eax = -1 - доступ к PCI запрещён; иначе
2540
  * eax = -1 - доступ к PCI запрещён; иначе
2523
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2541
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2524
Замечания:
2542
Замечания:
2525
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2543
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2526
    для приложений подфункцией 12 функции 21.
2544
    для приложений подфункцией 12 функции 21.
2527
  * Если PCI BIOS не поддерживается, то значение al неопределено.
2545
  * Если PCI BIOS не поддерживается, то значение al неопределено.
2528
 
2546
 
2529
======================================================================
2547
======================================================================
2530
====================== Функция 62, подфункция 2 ======================
2548
====================== Функция 62, подфункция 2 ======================
2531
== Получить механизм обращения к конфигурационному пространству PCI. =
2549
== Получить механизм обращения к конфигурационному пространству PCI. =
2532
======================================================================
2550
======================================================================
2533
Параметры:
2551
Параметры:
2534
  * eax = 62 - номер функции
2552
  * eax = 62 - номер функции
2535
  * bl = 2 - номер подфункции
2553
  * bl = 2 - номер подфункции
2536
Возвращаемое значение:
2554
Возвращаемое значение:
2537
  * eax = -1 - доступ к PCI запрещён; иначе
2555
  * eax = -1 - доступ к PCI запрещён; иначе
2538
  * al = механизм (1 или 2); прочие байты eax разрушаются
2556
  * al = механизм (1 или 2); прочие байты eax разрушаются
2539
Замечания:
2557
Замечания:
2540
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2558
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2541
    для приложений подфункцией 12 функции 21.
2559
    для приложений подфункцией 12 функции 21.
2542
  * Механизм обращения выбирается в соответствии
2560
  * Механизм обращения выбирается в соответствии
2543
    с характеристиками оборудования.
2561
    с характеристиками оборудования.
2544
  * Подфункции чтения и записи автоматически работают
2562
  * Подфункции чтения и записи автоматически работают
2545
    с выбранным механизмом.
2563
    с выбранным механизмом.
2546
 
2564
 
2547
======================================================================
2565
======================================================================
2548
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
2566
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
2549
======================================================================
2567
======================================================================
2550
Параметры:
2568
Параметры:
2551
  * eax = 62 - номер функции
2569
  * eax = 62 - номер функции
2552
  * bl = 4 - читать байт
2570
  * bl = 4 - читать байт
2553
  * bl = 5 - читать слово
2571
  * bl = 5 - читать слово
2554
  * bl = 6 - читать двойное слово
2572
  * bl = 6 - читать двойное слово
2555
  * bh = номер PCI-шины
2573
  * bh = номер PCI-шины
2556
  * ch = dddddfff, где ddddd = номер устройства на шине,
2574
  * ch = dddddfff, где ddddd = номер устройства на шине,
2557
    fff = номер функции устройства
2575
    fff = номер функции устройства
2558
  * cl = номер регистра (должен быть чётным для bl=5,
2576
  * cl = номер регистра (должен быть чётным для bl=5,
2559
    делиться на 4 для bl=6)
2577
    делиться на 4 для bl=6)
2560
Возвращаемое значение:
2578
Возвращаемое значение:
2561
  * eax = -1 - ошибка (запрещён доступ к PCI или
2579
  * eax = -1 - ошибка (запрещён доступ к PCI или
2562
    неподдерживаемые параметры); иначе
2580
    неподдерживаемые параметры); иначе
2563
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2581
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2564
    оставшаяся часть регистра eax разрушается
2582
    оставшаяся часть регистра eax разрушается
2565
Замечания:
2583
Замечания:
2566
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2584
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2567
    для приложений подфункцией 12 функции 21.
2585
    для приложений подфункцией 12 функции 21.
2568
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2586
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2569
    игнорирует номер функции. Получить механизм доступа можно вызовом
2587
    игнорирует номер функции. Получить механизм доступа можно вызовом
2570
    подфункции 2.
2588
    подфункции 2.
2571
  * Некоторые регистры стандартны и существуют для всех устройств,
2589
  * Некоторые регистры стандартны и существуют для всех устройств,
2572
    некоторые определяются конкретным устройством. Список первых
2590
    некоторые определяются конкретным устройством. Список первых
2573
    входит, например, в известный Interrupt List by Ralf Brown
2591
    входит, например, в известный Interrupt List by Ralf Brown
2574
    (http://www.pobox.com/~ralf/files.html,
2592
    (http://www.pobox.com/~ralf/files.html,
2575
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
2593
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
2576
    список вторых должен быть указан в документации по устройству.
2594
    список вторых должен быть указан в документации по устройству.
2577
 
2595
 
2578
======================================================================
2596
======================================================================
2579
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
2597
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
2580
======================================================================
2598
======================================================================
2581
Параметры:
2599
Параметры:
2582
  * eax = 62 - номер функции
2600
  * eax = 62 - номер функции
2583
  * bl = 8 - писать байт
2601
  * bl = 8 - писать байт
2584
  * bl = 9 - писать слово
2602
  * bl = 9 - писать слово
2585
  * bl = 10 - писать двойное слово
2603
  * bl = 10 - писать двойное слово
2586
  * bh = номер PCI-шины
2604
  * bh = номер PCI-шины
2587
  * ch = dddddfff, где ddddd = номер устройства на шине,
2605
  * ch = dddddfff, где ddddd = номер устройства на шине,
2588
    fff = номер функции устройства
2606
    fff = номер функции устройства
2589
  * cl = номер регистра (должен быть чётным для bl=9,
2607
  * cl = номер регистра (должен быть чётным для bl=9,
2590
    делиться на 4 для bl=10)
2608
    делиться на 4 для bl=10)
2591
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2609
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2592
    данные для записи
2610
    данные для записи
2593
Возвращаемое значение:
2611
Возвращаемое значение:
2594
  * eax = -1 - ошибка (запрещён доступ к PCI или
2612
  * eax = -1 - ошибка (запрещён доступ к PCI или
2595
    неподдерживаемые параметры)
2613
    неподдерживаемые параметры)
2596
  * eax = 0 - успешно
2614
  * eax = 0 - успешно
2597
Замечания:
2615
Замечания:
2598
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2616
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2599
    для приложений подфункцией 12 функции 21.
2617
    для приложений подфункцией 12 функции 21.
2600
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2618
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2601
    игнорирует номер функции. Получить механизм доступа можно вызовом
2619
    игнорирует номер функции. Получить механизм доступа можно вызовом
2602
    подфункции 2.
2620
    подфункции 2.
2603
  * Некоторые регистры стандартны и существуют для всех устройств,
2621
  * Некоторые регистры стандартны и существуют для всех устройств,
2604
    некоторые определяются конкретным устройством. Список первых
2622
    некоторые определяются конкретным устройством. Список первых
2605
    входит, например, в известный Interrupt List by Ralf Brown;
2623
    входит, например, в известный Interrupt List by Ralf Brown;
2606
    список вторых должен быть указан в документации по устройству.
2624
    список вторых должен быть указан в документации по устройству.
2607
 
2625
 
2608
======================================================================
2626
======================================================================
2609
================ Функция 63 - работа с доской отладки. ===============
2627
================ Функция 63 - работа с доской отладки. ===============
2610
======================================================================
2628
======================================================================
2611
Доска отладки представляет собой системный буфер (на 4096 байт),
2629
Доска отладки представляет собой системный буфер (на 4096 байт),
2612
в который любая программа может записать (вообще говоря, произвольные)
2630
в который любая программа может записать (вообще говоря, произвольные)
2613
данные и из которого другая программа может эти данные прочитать.
2631
данные и из которого другая программа может эти данные прочитать.
2614
Есть соглашение, в соответствии с которым записываемые данные -
2632
Есть соглашение, в соответствии с которым записываемые данные -
2615
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2633
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2616
выполнения программы. Ядро в определённых ситуациях также записывает
2634
выполнения программы. Ядро в определённых ситуациях также записывает
2617
на доску отладки сведения о выполнении некоторых функций;
2635
на доску отладки сведения о выполнении некоторых функций;
2618
по соглашению сообщения ядра начинаются с префикса "K : ".
2636
по соглашению сообщения ядра начинаются с префикса "K : ".
2619
Для просмотра доски отладки создано приложение board,
2637
Для просмотра доски отладки создано приложение board,
2620
которое считывает данные из буфера и отображает их в своём окне. board
2638
которое считывает данные из буфера и отображает их в своём окне. board
2621
понимает последовательность кодов 13,10 как переход на новую строку.
2639
понимает последовательность кодов 13,10 как переход на новую строку.
2622
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2640
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2623
В связи с появлением отладчика ценность доски отладки несколько
2641
В связи с появлением отладчика ценность доски отладки несколько
2624
снизилась, поскольку отладчик позволяет полностью контролировать ход
2642
снизилась, поскольку отладчик позволяет полностью контролировать ход
2625
выполнения программы, причём для этого не требуется никаких усилий
2643
выполнения программы, причём для этого не требуется никаких усилий
2626
со стороны самой программы. Тем не менее во многих случаях
2644
со стороны самой программы. Тем не менее во многих случаях
2627
доска отладки продолжает оставаться полезной.
2645
доска отладки продолжает оставаться полезной.
2628
 
2646
 
2629
---------------------------- Запись байта ----------------------------
2647
---------------------------- Запись байта ----------------------------
2630
Параметры:
2648
Параметры:
2631
  * eax = 63 - номер функции
2649
  * eax = 63 - номер функции
2632
  * ebx = 1 - номер подфункции
2650
  * ebx = 1 - номер подфункции
2633
  * cl = байт данных
2651
  * cl = байт данных
2634
Возвращаемое значение:
2652
Возвращаемое значение:
2635
  * функция не возвращает значения
2653
  * функция не возвращает значения
2636
Замечания:
2654
Замечания:
2637
  * Байт записывается в буфер. Длина буфера - 512 байт.
2655
  * Байт записывается в буфер. Длина буфера - 512 байт.
2638
    При переполнении буфера все полученные данные теряются
2656
    При переполнении буфера все полученные данные теряются
2639
    и заполнение начинается снова с нуля.
2657
    и заполнение начинается снова с нуля.
2640
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2658
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2641
    достаточно этой функции, вызываемой в цикле. Можно не писать
2659
    достаточно этой функции, вызываемой в цикле. Можно не писать
2642
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2660
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2643
    входящим в дистрибутив.
2661
    входящим в дистрибутив.
2644
 
2662
 
2645
---------------------------- Чтение байта ----------------------------
2663
---------------------------- Чтение байта ----------------------------
2646
Забирает байт из буфера.
2664
Забирает байт из буфера.
2647
Параметры:
2665
Параметры:
2648
  * eax = 63 - номер функции
2666
  * eax = 63 - номер функции
2649
  * ebx = 2 - номер подфункции
2667
  * ebx = 2 - номер подфункции
2650
Возвращаемое значение:
2668
Возвращаемое значение:
2651
  * eax = ebx = 0 - буфер пуст
2669
  * eax = ebx = 0 - буфер пуст
2652
  * eax = байт, ebx = 1 - байт успешно прочитан
2670
  * eax = байт, ebx = 1 - байт успешно прочитан
2653
 
2671
 
2654
======================================================================
2672
======================================================================
2655
========== Функция 64 - перераспределить память приложения. ==========
2673
========== Функция 64 - перераспределить память приложения. ==========
2656
======================================================================
2674
======================================================================
2657
Параметры:
2675
Параметры:
2658
  * eax = 64 - номер функции
2676
  * eax = 64 - номер функции
2659
  * ebx = 1 - единственная подфункция
2677
  * ebx = 1 - единственная подфункция
2660
  * ecx = новый размер памяти
2678
  * ecx = новый размер памяти
2661
Возвращаемое значение:
2679
Возвращаемое значение:
2662
  * eax = 0 - успешно
2680
  * eax = 0 - успешно
2663
  * eax = 1 - недостаточно памяти
2681
  * eax = 1 - недостаточно памяти
2664
Замечания:
2682
Замечания:
2665
  * Есть другой способ выделения/освобождения динамической памяти -
2683
  * Есть другой способ выделения/освобождения динамической памяти -
2666
    подфункции 11, 12, 13 функции 68.
2684
    подфункции 11, 12, 13 функции 68.
2667
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
2685
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
2668
    Вызов функции будет игнорироваться, если приложение создаст
2686
    Вызов функции будет игнорироваться, если приложение создаст
2669
    локальную кучу вызовом 68.11.
2687
    локальную кучу вызовом 68.11.
2670
 
2688
 
2671
======================================================================
2689
======================================================================
2672
========= Функция 65 - вывести изображение с палитрой в окно. ========
2690
========= Функция 65 - вывести изображение с палитрой в окно. ========
2673
======================================================================
2691
======================================================================
2674
Параметры:
2692
Параметры:
2675
  * eax = 65 - номер функции
2693
  * eax = 65 - номер функции
2676
  * ebx = указатель на изображение
2694
  * ebx = указатель на изображение
2677
  * ecx = [размер по оси x]*65536 + [размер по оси y]
2695
  * ecx = [размер по оси x]*65536 + [размер по оси y]
2678
  * edx = [координата по оси x]*65536 + [координата по оси y]
2696
  * edx = [координата по оси x]*65536 + [координата по оси y]
2679
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
2697
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
2680
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
2698
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
2681
          игнорируется при esi > 8
2699
          игнорируется при esi > 8
2682
  * ebp = смещение данных каждой следующей строки изображения
2700
  * ebp = смещение данных каждой следующей строки изображения
2683
          относительно предыдущей
2701
          относительно предыдущей
2684
Возвращаемое значение:
2702
Возвращаемое значение:
2685
  * функция не возвращает значения
2703
  * функция не возвращает значения
2686
Замечания:
2704
Замечания:
2687
  * Координаты изображения - это координаты верхнего левого угла
2705
  * Координаты изображения - это координаты верхнего левого угла
2688
    изображения относительно окна.
2706
    изображения относительно окна.
2689
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
2707
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
2690
    за исключением, быть может, последних байтов строк, содержит
2708
    за исключением, быть может, последних байтов строк, содержит
2691
    информацию о цвете 8 пикселей, старший бит соответствует первому
2709
    информацию о цвете 8 пикселей, старший бит соответствует первому
2692
    пикселю.
2710
    пикселю.
2693
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
2711
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
2694
    за исключением, быть может, последних байтов строк, содержит
2712
    за исключением, быть может, последних байтов строк, содержит
2695
    информацию о цвете 4 пикселей, старшие два бита соответствуют
2713
    информацию о цвете 4 пикселей, старшие два бита соответствуют
2696
    первому пикселю.
2714
    первому пикселю.
2697
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
2715
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
2698
    за исключением последних байтов строк (если ширина изображения
2716
    за исключением последних байтов строк (если ширина изображения
2699
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
2717
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
2700
    соответствует первому пикселю.
2718
    соответствует первому пикселю.
2701
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
2719
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
2702
    рассматривается как индекс в палитре.
2720
    рассматривается как индекс в палитре.
2703
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
2721
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
2704
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
2722
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
2705
    этот тип изображения идентичен 8 бит на пиксель без палитры.
2723
    этот тип изображения идентичен 8 бит на пиксель без палитры.
2706
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
2724
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
2707
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
2725
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
2708
    по 5 пикселей на каждый цвет.
2726
    по 5 пикселей на каждый цвет.
2709
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
2727
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
2710
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
2728
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
2711
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
2729
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
2712
    кодируется тремя байтами - последовательно синяя, зелёная, красная
2730
    кодируется тремя байтами - последовательно синяя, зелёная, красная
2713
    составляющие цвета.
2731
    составляющие цвета.
2714
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
2732
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
2715
    есть ещё игнорируемый четвёртый байт.
2733
    есть ещё игнорируемый четвёртый байт.
2716
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
2734
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
2717
    esi=24, ebp=0.
2735
    esi=24, ebp=0.
2718
 
2736
 
2719
======================================================================
2737
======================================================================
2720
================= Функция 66 - работа с клавиатурой. =================
2738
================= Функция 66 - работа с клавиатурой. =================
2721
======================================================================
2739
======================================================================
2722
Режим ввода влияет на результаты чтения клавиш функцией 2.
2740
Режим ввода влияет на результаты чтения клавиш функцией 2.
2723
При загрузке программы для неё устанавливается ASCII-режим ввода.
2741
При загрузке программы для неё устанавливается ASCII-режим ввода.
2724
 
2742
 
2725
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
2743
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
2726
Параметры:
2744
Параметры:
2727
  * eax = 66 - номер функции
2745
  * eax = 66 - номер функции
2728
  * ebx = 1 - номер подфункции
2746
  * ebx = 1 - номер подфункции
2729
  * ecx = режим:
2747
  * ecx = режим:
2730
    * 0 = обычный (ASCII-символы)
2748
    * 0 = обычный (ASCII-символы)
2731
    * 1 = сканкоды
2749
    * 1 = сканкоды
2732
Возвращаемое значение:
2750
Возвращаемое значение:
2733
  * функция не возвращает значения
2751
  * функция не возвращает значения
2734
 
2752
 
2735
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
2753
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
2736
Параметры:
2754
Параметры:
2737
  * eax = 66 - номер функции
2755
  * eax = 66 - номер функции
2738
  * ebx = 2 - номер подфункции
2756
  * ebx = 2 - номер подфункции
2739
Возвращаемое значение:
2757
Возвращаемое значение:
2740
  * eax = текущий режим
2758
  * eax = текущий режим
2741
 
2759
 
2742
------- Подфункция 3 - получить состояние управляющих клавиш. --------
2760
------- Подфункция 3 - получить состояние управляющих клавиш. --------
2743
Параметры:
2761
Параметры:
2744
  * eax = 66 - номер функции
2762
  * eax = 66 - номер функции
2745
  * ebx = 3 - номер подфункции
2763
  * ebx = 3 - номер подфункции
2746
Возвращаемое значение:
2764
Возвращаемое значение:
2747
  * eax = битовая маска:
2765
  * eax = битовая маска:
2748
  * бит 0  (маска 1): левый Shift нажат
2766
  * бит 0  (маска 1): левый Shift нажат
2749
  * бит 1  (маска 2): правый Shift нажат
2767
  * бит 1  (маска 2): правый Shift нажат
2750
  * бит 2  (маска 4): левый Ctrl нажат
2768
  * бит 2  (маска 4): левый Ctrl нажат
2751
  * бит 3  (маска 8): правый Ctrl нажат
2769
  * бит 3  (маска 8): правый Ctrl нажат
2752
  * бит 4  (маска 0x10): левый Alt нажат
2770
  * бит 4  (маска 0x10): левый Alt нажат
2753
  * бит 5  (маска 0x20): правый Alt нажат
2771
  * бит 5  (маска 0x20): правый Alt нажат
2754
  * бит 6  (маска 0x40): CapsLock включён
2772
  * бит 6  (маска 0x40): CapsLock включён
2755
  * бит 7  (маска 0x80): NumLock включён
2773
  * бит 7  (маска 0x80): NumLock включён
2756
  * бит 8  (маска 0x100): ScrollLock включён
2774
  * бит 8  (маска 0x100): ScrollLock включён
2757
  * бит 9  (маска 0x200): левый Win нажат
2775
  * бит 9  (маска 0x200): левый Win нажат
2758
  * бит 10 (маска 0x400): правый Win нажат
2776
  * бит 10 (маска 0x400): правый Win нажат
2759
  * прочие биты сброшены
2777
  * прочие биты сброшены
2760
 
2778
 
2761
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
2779
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
2762
О нажатии "горячей клавиши" извещаются только приложения,
2780
О нажатии "горячей клавиши" извещаются только приложения,
2763
установившие её; активное приложение (к которому поступает
2781
установившие её; активное приложение (к которому поступает
2764
весь нормальный ввод) таких клавиш не получает.
2782
весь нормальный ввод) таких клавиш не получает.
2765
Извещение заключается в посылке события с кодом 2.
2783
Извещение заключается в посылке события с кодом 2.
2766
Прочитать "горячую клавишу" можно так же, как и обычную, -
2784
Прочитать "горячую клавишу" можно так же, как и обычную, -
2767
функцией 2.
2785
функцией 2.
2768
Параметры:
2786
Параметры:
2769
  * eax = 66 - номер функции
2787
  * eax = 66 - номер функции
2770
  * ebx = 4 - номер подфункции
2788
  * ebx = 4 - номер подфункции
2771
  * cl задаёт сканкод клавиши;
2789
  * cl задаёт сканкод клавиши;
2772
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
2790
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
2773
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
2791
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
2774
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
2792
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
2775
      * 0 = ни одна из клавиш не должна быть нажата;
2793
      * 0 = ни одна из клавиш не должна быть нажата;
2776
      * 1 = ровно одна из клавиш должна быть нажата;
2794
      * 1 = ровно одна из клавиш должна быть нажата;
2777
      * 2 = обе клавиши должны быть нажаты;
2795
      * 2 = обе клавиши должны быть нажаты;
2778
      * 3 = должна быть нажата LShift, но не RShift;
2796
      * 3 = должна быть нажата LShift, но не RShift;
2779
      * 4 = должна быть нажата RShift, но не LShift
2797
      * 4 = должна быть нажата RShift, но не LShift
2780
    * Y - аналогично для LCtrl и RCtrl;
2798
    * Y - аналогично для LCtrl и RCtrl;
2781
    * X - аналогично для LAlt и RAlt
2799
    * X - аналогично для LAlt и RAlt
2782
Возвращаемое значение:
2800
Возвращаемое значение:
2783
  * eax=0 - успешно
2801
  * eax=0 - успешно
2784
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
2802
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
2785
Замечания:
2803
Замечания:
2786
  * Горячая клавиша может срабатывать либо при нажатии,
2804
  * Горячая клавиша может срабатывать либо при нажатии,
2787
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
2805
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
2788
    чем сканкод нажатия (т.е. установлен старший бит).
2806
    чем сканкод нажатия (т.е. установлен старший бит).
2789
  * Несколько приложений могут установить одну и ту же комбинацию;
2807
  * Несколько приложений могут установить одну и ту же комбинацию;
2790
    о нажатии такой комбинации будут извещаться все такие приложения.
2808
    о нажатии такой комбинации будут извещаться все такие приложения.
2791
 
2809
 
2792
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
2810
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
2793
Параметры:
2811
Параметры:
2794
  * eax = 66 - номер функции
2812
  * eax = 66 - номер функции
2795
  * ebx = 5 - номер подфункции
2813
  * ebx = 5 - номер подфункции
2796
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
2814
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
2797
Возвращаемое значение:
2815
Возвращаемое значение:
2798
  * eax = 0 - успешно
2816
  * eax = 0 - успешно
2799
  * eax = 1 - нет такой горячей клавиши
2817
  * eax = 1 - нет такой горячей клавиши
2800
Замечания:
2818
Замечания:
2801
  * При завершении процесса/потока удаляются все установленные им
2819
  * При завершении процесса/потока удаляются все установленные им
2802
    горячие клавиши.
2820
    горячие клавиши.
2803
  * Вызов функции не влияет на другие приложения.
2821
  * Вызов функции не влияет на другие приложения.
2804
    Если другое приложение определило эту же комбинацию,
2822
    Если другое приложение определило эту же комбинацию,
2805
    оно по-прежнему будет получать уведомления.
2823
    оно по-прежнему будет получать уведомления.
2806
 
2824
 
2807
------------- Подфункция 6 - заблокировать обычный ввод. -------------
2825
------------- Подфункция 6 - заблокировать обычный ввод. -------------
2808
Параметры:
2826
Параметры:
2809
  * eax = 66 - номер функции
2827
  * eax = 66 - номер функции
2810
  * ebx = 6 - номер подфункции
2828
  * ebx = 6 - номер подфункции
2811
Возвращаемое значение:
2829
Возвращаемое значение:
2812
  * функция не возвращает значения
2830
  * функция не возвращает значения
2813
Замечания:
2831
Замечания:
2814
  * Блокируется обычный ввод данных с клавиатуры для установленных
2832
  * Блокируется обычный ввод данных с клавиатуры для установленных
2815
    "горячих" клавиш
2833
    "горячих" клавиш
2816
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2834
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2817
 
2835
 
2818
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
2836
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
2819
Параметры:
2837
Параметры:
2820
  * eax = 66 - номер функции
2838
  * eax = 66 - номер функции
2821
  * ebx = 7 - номер подфункции
2839
  * ebx = 7 - номер подфункции
2822
Возвращаемое значение:
2840
Возвращаемое значение:
2823
  * функция не возвращает значения
2841
  * функция не возвращает значения
2824
Замечания:
2842
Замечания:
2825
  * Разблокирование результатов ф. 66.6
2843
  * Разблокирование результатов ф. 66.6
2826
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2844
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2827
 
2845
 
2828
======================================================================
2846
======================================================================
2829
============ Функция 67 - изменить положение/размеры окна. ===========
2847
============ Функция 67 - изменить положение/размеры окна. ===========
2830
======================================================================
2848
======================================================================
2831
Параметры:
2849
Параметры:
2832
  * eax = 67 - номер функции
2850
  * eax = 67 - номер функции
2833
  * ebx = новая x-координата окна
2851
  * ebx = новая x-координата окна
2834
  * ecx = новая y-координата окна
2852
  * ecx = новая y-координата окна
2835
  * edx = новый x-размер окна
2853
  * edx = новый x-размер окна
2836
  * esi = новый y-размер окна
2854
  * esi = новый y-размер окна
2837
Возвращаемое значение:
2855
Возвращаемое значение:
2838
  * функция не возвращает значения
2856
  * функция не возвращает значения
2839
Замечания:
2857
Замечания:
2840
  * Значение -1 для параметра означает "не изменять"; например, для
2858
  * Значение -1 для параметра означает "не изменять"; например, для
2841
    перемещения окна без изменения размеров можно указать edx=esi=-1.
2859
    перемещения окна без изменения размеров можно указать edx=esi=-1.
2842
  * Предварительно окно должно быть определено функцией 0.
2860
  * Предварительно окно должно быть определено функцией 0.
2843
    Она же задаёт начальные координаты и размеры окна.
2861
    Она же задаёт начальные координаты и размеры окна.
2844
  * Размеры окна понимаются в смысле функции 0, т.е.
2862
  * Размеры окна понимаются в смысле функции 0, т.е.
2845
    на один пиксель меньше, чем реальные размеры.
2863
    на один пиксель меньше, чем реальные размеры.
2846
  * Вызов функции для максимизированных окон просто игнорируется.
2864
  * Вызов функции для максимизированных окон просто игнорируется.
2847
  * Для окон соответствующих стилей положение и/или размеры могут быть
2865
  * Для окон соответствующих стилей положение и/или размеры могут быть
2848
    изменены пользователем; текущие положение и размеры могут быть
2866
    изменены пользователем; текущие положение и размеры могут быть
2849
    получены вызовом функции 9.
2867
    получены вызовом функции 9.
2850
  * Функция посылает окну событие перерисовки (с кодом 1).
2868
  * Функция посылает окну событие перерисовки (с кодом 1).
2851
 
2869
 
2852
======================================================================
2870
======================================================================
2853
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
2871
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
2854
======================================================================
2872
======================================================================
2855
Параметры:
2873
Параметры:
2856
  * eax = 68 - номер функции
2874
  * eax = 68 - номер функции
2857
  * ebx = 0 - номер подфункции
2875
  * ebx = 0 - номер подфункции
2858
Возвращаемое значение:
2876
Возвращаемое значение:
2859
  * eax = число переключений задач с момента загрузки системы
2877
  * eax = число переключений задач с момента загрузки системы
2860
    (по модулю 2^32)
2878
    (по модулю 2^32)
2861
 
2879
 
2862
======================================================================
2880
======================================================================
2863
====================== Функция 68, подфункция 1 ======================
2881
====================== Функция 68, подфункция 1 ======================
2864
============ Переключиться на следующий поток выполнения. ============
2882
============ Переключиться на следующий поток выполнения. ============
2865
======================================================================
2883
======================================================================
2866
Функция завершает текущий квант времени, выделенный потоку,
2884
Функция завершает текущий квант времени, выделенный потоку,
2867
и переключается на следующий.
2885
и переключается на следующий.
2868
(Какой поток какого процесса будет следующим, предсказать нельзя).
2886
(Какой поток какого процесса будет следующим, предсказать нельзя).
2869
Позднее, когда до текущего потока дойдёт очередь,
2887
Позднее, когда до текущего потока дойдёт очередь,
2870
выполнение возобновится.
2888
выполнение возобновится.
2871
Параметры:
2889
Параметры:
2872
  * eax = 68 - номер функции
2890
  * eax = 68 - номер функции
2873
  * ebx = 1 - номер подфункции
2891
  * ebx = 1 - номер подфункции
2874
Возвращаемое значение:
2892
Возвращаемое значение:
2875
  * функция не возвращает значения
2893
  * функция не возвращает значения
2876
 
2894
 
2877
======================================================================
2895
======================================================================
2878
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
2896
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
2879
======================================================================
2897
======================================================================
2880
Параметры:
2898
Параметры:
2881
  * eax = 68 - номер функции
2899
  * eax = 68 - номер функции
2882
  * ebx = 2 - номер подфункции
2900
  * ebx = 2 - номер подфункции
2883
  * ecx = требуемое действие:
2901
  * ecx = требуемое действие:
2884
    * ecx = 0 - разрешить выполнение инструкции rdpmc
2902
    * ecx = 0 - разрешить выполнение инструкции rdpmc
2885
      (ReaD Performance-Monitoring Counters)
2903
      (ReaD Performance-Monitoring Counters)
2886
    * ecx = 1 - узнать, включён/выключен кэш
2904
    * ecx = 1 - узнать, включён/выключен кэш
2887
    * ecx = 2 - включить кэш
2905
    * ecx = 2 - включить кэш
2888
    * ecx = 3 - выключить кэш
2906
    * ecx = 3 - выключить кэш
2889
Возвращаемое значение:
2907
Возвращаемое значение:
2890
  * для ecx=0:
2908
  * для ecx=0:
2891
    * eax = значение cr4
2909
    * eax = значение cr4
2892
  * для ecx=1:
2910
  * для ecx=1:
2893
    * eax = (cr0 and 0x60000000):
2911
    * eax = (cr0 and 0x60000000):
2894
    * eax = 0 - кэш включён
2912
    * eax = 0 - кэш включён
2895
    * eax <> 0 - кэш выключен
2913
    * eax <> 0 - кэш выключен
2896
  * для ecx=2 и ecx=3:
2914
  * для ecx=2 и ecx=3:
2897
    * функция не возвращает значения
2915
    * функция не возвращает значения
2898
 
2916
 
2899
======================================================================
2917
======================================================================
2900
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
2918
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
2901
======================================================================
2919
======================================================================
2902
MSR = Model Specific Register; полный список MSR-регистров процессора
2920
MSR = Model Specific Register; полный список MSR-регистров процессора
2903
содержится в документации по процессору (например, IA-32 Intel
2921
содержится в документации по процессору (например, IA-32 Intel
2904
Architecture Software Developer's Manual, Volume 3, Appendix B);
2922
Architecture Software Developer's Manual, Volume 3, Appendix B);
2905
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2923
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2906
Параметры:
2924
Параметры:
2907
  * eax = 68 - номер функции
2925
  * eax = 68 - номер функции
2908
  * ebx = 3 - номер подфункции
2926
  * ebx = 3 - номер подфункции
2909
  * ecx игнорируется
2927
  * ecx игнорируется
2910
  * edx = адрес MSR
2928
  * edx = адрес MSR
2911
Возвращаемое значение:
2929
Возвращаемое значение:
2912
  * ebx:eax = старший:младший dword результата
2930
  * ebx:eax = старший:младший dword результата
2913
Замечания:
2931
Замечания:
2914
  * Указание в ecx несуществующего или нереализованного для данного
2932
  * Указание в ecx несуществующего или нереализованного для данного
2915
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2933
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2916
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2934
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2917
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2935
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2918
    которое всё равно прибьёт поток.
2936
    которое всё равно прибьёт поток.
2919
 
2937
 
2920
======================================================================
2938
======================================================================
2921
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
2939
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
2922
======================================================================
2940
======================================================================
2923
MSR = Model Specific Register; полный список MSR-регистров процессора
2941
MSR = Model Specific Register; полный список MSR-регистров процессора
2924
содержится в документации по процессору (например, IA-32 Intel
2942
содержится в документации по процессору (например, IA-32 Intel
2925
Architecture Software Developer's Manual, Volume 3, Appendix B);
2943
Architecture Software Developer's Manual, Volume 3, Appendix B);
2926
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2944
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2927
Параметры:
2945
Параметры:
2928
  * eax = 68 - номер функции
2946
  * eax = 68 - номер функции
2929
  * ebx = 4 - номер подфункции
2947
  * ebx = 4 - номер подфункции
2930
  * ecx игнорируется
2948
  * ecx игнорируется
2931
  * edx = адрес MSR
2949
  * edx = адрес MSR
2932
  * esi:edi = старший:младший dword
2950
  * esi:edi = старший:младший dword
2933
Возвращаемое значение:
2951
Возвращаемое значение:
2934
  * функция не возвращает значения
2952
  * функция не возвращает значения
2935
Замечания:
2953
Замечания:
2936
  * Указание в ecx несуществующего или нереализованного для данного
2954
  * Указание в ecx несуществующего или нереализованного для данного
2937
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2955
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2938
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2956
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2939
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2957
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2940
    которое всё равно прибьёт поток.
2958
    которое всё равно прибьёт поток.
2941
 
2959
 
2942
======================================================================
2960
======================================================================
2943
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
2961
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
2944
======================================================================
2962
======================================================================
2945
Параметры:
2963
Параметры:
2946
  * eax = 68 - номер функции
2964
  * eax = 68 - номер функции
2947
  * ebx = 11 - номер подфункции
2965
  * ebx = 11 - номер подфункции
2948
Возвращаемое значение:
2966
Возвращаемое значение:
2949
  * eax = 0 - неуспех
2967
  * eax = 0 - неуспех
2950
  * иначе размер созданной кучи
2968
  * иначе размер созданной кучи
2951
Замечания:
2969
Замечания:
2952
  * Вызов функции инициализирует кучу, из которой впоследствии можно
2970
  * Вызов функции инициализирует кучу, из которой впоследствии можно
2953
    выделять и освобождать блоки памяти подфункциями 12 и 13.
2971
    выделять и освобождать блоки памяти подфункциями 12 и 13.
2954
    Размер кучи равен размеру всей свободной памяти приложения.
2972
    Размер кучи равен размеру всей свободной памяти приложения.
2955
  * При повторном вызове функции тем же процессом функция вернёт
2973
  * При повторном вызове функции тем же процессом функция вернёт
2956
    размер существующей кучи.
2974
    размер существующей кучи.
2957
  * После создания кучи вызовы функции 64 игнорируются.
2975
  * После создания кучи вызовы функции 64 игнорируются.
2958
 
2976
 
2959
======================================================================
2977
======================================================================
2960
========== Функция 68, подфункция 12 - выделить блок памяти. =========
2978
========== Функция 68, подфункция 12 - выделить блок памяти. =========
2961
======================================================================
2979
======================================================================
2962
Параметры:
2980
Параметры:
2963
  * eax = 68 - номер функции
2981
  * eax = 68 - номер функции
2964
  * ebx = 12 - номер подфункции
2982
  * ebx = 12 - номер подфункции
2965
  * ecx = требуемый размер в байтах
2983
  * ecx = требуемый размер в байтах
2966
Возвращаемое значение:
2984
Возвращаемое значение:
2967
  * eax = указатель на выделенный блок
2985
  * eax = указатель на выделенный блок
2968
Замечания:
2986
Замечания:
2969
  * Предварительно следует инициализировать кучу процесса вызовом
2987
  * Предварительно следует инициализировать кучу процесса вызовом
2970
    подфункции 11.
2988
    подфункции 11.
2971
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
2989
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
2972
    размер выделенного блока больше или равен запрошенному.
2990
    размер выделенного блока больше или равен запрошенному.
2973
 
2991
 
2974
======================================================================
2992
======================================================================
2975
========= Функция 68, подфункция 13 - освободить блок памяти. ========
2993
========= Функция 68, подфункция 13 - освободить блок памяти. ========
2976
======================================================================
2994
======================================================================
2977
Параметры:
2995
Параметры:
2978
  * eax = 68 - номер функции
2996
  * eax = 68 - номер функции
2979
  * ebx = 13 - номер подфункции
2997
  * ebx = 13 - номер подфункции
2980
  * ecx = указатель на блок памяти
2998
  * ecx = указатель на блок памяти
2981
Возвращаемое значение:
2999
Возвращаемое значение:
2982
  * eax = 1 - успешно
3000
  * eax = 1 - успешно
2983
  * eax = 0 - неудача
3001
  * eax = 0 - неудача
2984
Замечания:
3002
Замечания:
2985
  * Блок памяти должен быть ранее выделен подфункцией 12
3003
  * Блок памяти должен быть ранее выделен подфункцией 12
2986
    или подфункцией 20.
3004
    или подфункцией 20.
2987
 
3005
 
2988
======================================================================
3006
======================================================================
2989
====================== Функция 68, подфункция 14 =====================
3007
====================== Функция 68, подфункция 14 =====================
2990
====== Ожидать получения сигнала от других приложений/драйверов. =====
3008
====== Ожидать получения сигнала от других приложений/драйверов. =====
2991
======================================================================
3009
======================================================================
2992
Параметры:
3010
Параметры:
2993
  * eax = 68 - номер функции
3011
  * eax = 68 - номер функции
2994
  * ebx = 14 - номер подфункции
3012
  * ebx = 14 - номер подфункции
2995
  * ecx = указатель на буфер для информации (24 байта)
3013
  * ecx = указатель на буфер для информации (24 байта)
2996
Возвращаемое значение:
3014
Возвращаемое значение:
2997
  * eax разрушается
3015
  * eax разрушается
2998
  * буфер, на который указывает ecx, содержит следующую информацию:
3016
  * буфер, на который указывает ecx, содержит следующую информацию:
2999
    * +0: dword: идентификатор последующих данных сигнала
3017
    * +0: dword: идентификатор последующих данных сигнала
3000
    * +4: данные принятого сигнала (20 байт), формат которых
3018
    * +4: данные принятого сигнала (20 байт), формат которых
3001
          определяется первым dword-ом
3019
          определяется первым dword-ом
3002
 
3020
 
3003
======================================================================
3021
======================================================================
3004
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
3022
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
3005
======================================================================
3023
======================================================================
3006
Параметры:
3024
Параметры:
3007
  * eax = 68 - номер функции
3025
  * eax = 68 - номер функции
3008
  * ebx = 16 - номер подфункции
3026
  * ebx = 16 - номер подфункции
3009
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3027
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3010
Возвращаемое значение:
3028
Возвращаемое значение:
3011
  * eax = 0 - неудача
3029
  * eax = 0 - неудача
3012
  * иначе eax = хэндл драйвера
3030
  * иначе eax = хэндл драйвера
3013
Замечания:
3031
Замечания:
3014
  * Если драйвер ещё не загружен, он загружается;
3032
  * Если драйвер ещё не загружен, он загружается;
3015
    если драйвер уже загружен, ничего не меняется.
3033
    если драйвер уже загружен, ничего не меняется.
3016
  * Имя драйвера чувствительно к регистру символов.
3034
  * Имя драйвера чувствительно к регистру символов.
3017
    Максимальная длина имени - 16 символов, включая завершающий
3035
    Максимальная длина имени - 16 символов, включая завершающий
3018
    нулевой символ, остальные символы игнорируются.
3036
    нулевой символ, остальные символы игнорируются.
3019
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
3037
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
3020
 
3038
 
3021
======================================================================
3039
======================================================================
3022
========== Функция 68, подфункция 17 - управление драйвером. =========
3040
========== Функция 68, подфункция 17 - управление драйвером. =========
3023
======================================================================
3041
======================================================================
3024
Параметры:
3042
Параметры:
3025
  * eax = 68 - номер функции
3043
  * eax = 68 - номер функции
3026
  * ebx = 17 - номер подфункции
3044
  * ebx = 17 - номер подфункции
3027
  * ecx = указатель на управляющую структуру:
3045
  * ecx = указатель на управляющую структуру:
3028
    * +0: dword: хэндл драйвера
3046
    * +0: dword: хэндл драйвера
3029
    * +4: dword: код функции драйвера
3047
    * +4: dword: код функции драйвера
3030
    * +8: dword: указатель на входные данные
3048
    * +8: dword: указатель на входные данные
3031
    * +12 = +0xC: dword: размер входных данных
3049
    * +12 = +0xC: dword: размер входных данных
3032
    * +16 = +0x10: dword: указатель на выходные данные
3050
    * +16 = +0x10: dword: указатель на выходные данные
3033
    * +20 = +0x14: dword: размер выходных данных
3051
    * +20 = +0x14: dword: размер выходных данных
3034
Возвращаемое значение:
3052
Возвращаемое значение:
3035
  * eax = определяется драйвером
3053
  * eax = определяется драйвером
3036
Замечания:
3054
Замечания:
3037
  * Коды функций и структура входных/выходных данных
3055
  * Коды функций и структура входных/выходных данных
3038
    определяются драйвером.
3056
    определяются драйвером.
3039
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
3057
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
3040
 
3058
 
3041
======================================================================
3059
======================================================================
3042
============= Функция 68, подфункция 19 - загрузить DLL. =============
3060
============= Функция 68, подфункция 19 - загрузить DLL. =============
3043
======================================================================
3061
======================================================================
3044
Параметры:
3062
Параметры:
3045
  * eax = 68 - номер функции
3063
  * eax = 68 - номер функции
3046
  * ebx = 19 - номер подфункции
3064
  * ebx = 19 - номер подфункции
3047
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
3065
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
3048
Возвращаемое значение:
3066
Возвращаемое значение:
3049
  * eax = 0 - неудача
3067
  * eax = 0 - неудача
3050
  * иначе eax = указатель на таблицу экспорта DLL
3068
  * иначе eax = указатель на таблицу экспорта DLL
3051
Замечания:
3069
Замечания:
3052
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3070
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3053
    заканчивающийся нулём. Первый dword в структуре является
3071
    заканчивающийся нулём. Первый dword в структуре является
3054
    указателем на имя функции, второй содержит адрес функции.
3072
    указателем на имя функции, второй содержит адрес функции.
3055
 
3073
 
3056
======================================================================
3074
======================================================================
3057
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
3075
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
3058
======================================================================
3076
======================================================================
3059
Параметры:
3077
Параметры:
3060
  * eax = 68 - номер функции
3078
  * eax = 68 - номер функции
3061
  * ebx = 20 - номер подфункции
3079
  * ebx = 20 - номер подфункции
3062
  * ecx = новый размер в байтах
3080
  * ecx = новый размер в байтах
3063
  * edx = указатель на уже выделенный блок памяти
3081
  * edx = указатель на уже выделенный блок памяти
3064
Возвращаемое значение:
3082
Возвращаемое значение:
3065
  * eax = указатель на перераспределённый блок, 0 при ошибке
3083
  * eax = указатель на перераспределённый блок, 0 при ошибке
3066
Замечания:
3084
Замечания:
3067
  * Предварительно следует инициализировать кучу процесса вызовом
3085
  * Предварительно следует инициализировать кучу процесса вызовом
3068
    подфункции 11.
3086
    подфункции 11.
3069
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3087
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3070
    размер выделенного блока больше или равен запрошенному.
3088
    размер выделенного блока больше или равен запрошенному.
3071
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3089
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3072
    подфункцией 12. В противном случае блок памяти по адресу edx
3090
    подфункцией 12. В противном случае блок памяти по адресу edx
3073
    должен быть ранее выделен подфункцией 12 или
3091
    должен быть ранее выделен подфункцией 12 или
3074
    описываемой подфункцией.
3092
    описываемой подфункцией.
3075
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3093
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3076
    возвращает 0.
3094
    возвращает 0.
3077
  * Содержимое памяти вплоть до наименьшего из старого и нового
3095
  * Содержимое памяти вплоть до наименьшего из старого и нового
3078
    размеров сохраняется.
3096
    размеров сохраняется.
3079
 
3097
 
3080
======================================================================
3098
======================================================================
3081
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
3099
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
3082
======================================================================
3100
======================================================================
3083
Параметры:
3101
Параметры:
3084
  * eax = 68 - номер функции
3102
  * eax = 68 - номер функции
3085
  * ebx = 21 - номер подфункции
3103
  * ebx = 21 - номер подфункции
3086
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3104
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3087
  * edx = указатель на командную строку
3105
  * edx = указатель на командную строку
3088
Возвращаемое значение:
3106
Возвращаемое значение:
3089
  * eax = 0 - неудача
3107
  * eax = 0 - неудача
3090
  * иначе eax = хэндл драйвера
3108
  * иначе eax = хэндл драйвера
3091
Замечания:
3109
Замечания:
3092
  * Если драйвер ещё не загружен, он загружается;
3110
  * Если драйвер ещё не загружен, он загружается;
3093
    если драйвер уже загружен, ничего не меняется.
3111
    если драйвер уже загружен, ничего не меняется.
3094
 
3112
 
3095
======================================================================
3113
======================================================================
3096
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
3114
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
3097
======================================================================
3115
======================================================================
3098
Параметры:
3116
Параметры:
3099
  * eax = 68 - номер функции
3117
  * eax = 68 - номер функции
3100
  * ebx = 22 - номер подфункции
3118
  * ebx = 22 - номер подфункции
3101
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3119
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3102
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3120
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3103
  * esi = флаги открытия и доступа:
3121
  * esi = флаги открытия и доступа:
3104
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3122
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3105
                          Если область с таким именем не существует,
3123
                          Если область с таким именем не существует,
3106
                          функция вернёт код ошибки 5.
3124
                          функция вернёт код ошибки 5.
3107
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3125
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3108
                          область памяти.
3126
                          область памяти.
3109
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3127
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3110
                          Если область с таким именем уже существует,
3128
                          Если область с таким именем уже существует,
3111
                          функция вернёт код ошибки 10.
3129
                          функция вернёт код ошибки 10.
3112
    * SHM_READ        = 0x00 - доступ только на чтение
3130
    * SHM_READ        = 0x00 - доступ только на чтение
3113
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3131
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3114
Возвращаемое значение:
3132
Возвращаемое значение:
3115
  * eax = указатель на область памяти, 0 при ошибке
3133
  * eax = указатель на область памяти, 0 при ошибке
3116
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3134
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3117
    edx = 0 - успех, иначе - код ошибки
3135
    edx = 0 - успех, иначе - код ошибки
3118
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3136
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3119
    edx = код ошибки (при eax=0) или размер области в байтах
3137
    edx = код ошибки (при eax=0) или размер области в байтах
3120
Коды ошибок:
3138
Коды ошибок:
3121
  * E_NOTFOUND = 5
3139
  * E_NOTFOUND = 5
3122
  * E_ACCESS = 10
3140
  * E_ACCESS = 10
3123
  * E_NOMEM = 30
3141
  * E_NOMEM = 30
3124
  * E_PARAM = 33
3142
  * E_PARAM = 33
3125
Замечания:
3143
Замечания:
3126
  * Предварительно следует инициализировать кучу процесса вызовом
3144
  * Предварительно следует инициализировать кучу процесса вызовом
3127
    подфункции 11.
3145
    подфункции 11.
3128
  * Если создаётся новая область, то флаги доступа устанавливают
3146
  * Если создаётся новая область, то флаги доступа устанавливают
3129
    максимальные права доступа для остальных процессов. Попытка
3147
    максимальные права доступа для остальных процессов. Попытка
3130
    открытия другим потоком с неразрешёнными правами провалится
3148
    открытия другим потоком с неразрешёнными правами провалится
3131
    с кодом ошибки E_ACCESS.
3149
    с кодом ошибки E_ACCESS.
3132
  * Процесс, создавший область, всегда имеет доступ на запись.
3150
  * Процесс, создавший область, всегда имеет доступ на запись.
3133
 
3151
 
3134
======================================================================
3152
======================================================================
3135
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
3153
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
3136
======================================================================
3154
======================================================================
3137
Параметры:
3155
Параметры:
3138
  * eax = 68 - номер функции
3156
  * eax = 68 - номер функции
3139
  * ebx = 23 - номер подфункции
3157
  * ebx = 23 - номер подфункции
3140
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3158
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3141
Возвращаемое значение:
3159
Возвращаемое значение:
3142
  * eax разрушается
3160
  * eax разрушается
3143
Замечания:
3161
Замечания:
3144
  * Область памяти физически освобождается (с забыванием всех данных
3162
  * Область памяти физически освобождается (с забыванием всех данных
3145
    и высвобождением физической памяти), когда её закроют
3163
    и высвобождением физической памяти), когда её закроют
3146
    все открывшие потоки.
3164
    все открывшие потоки.
3147
  * При завершении потока освобождаются все открытые им
3165
  * При завершении потока освобождаются все открытые им
3148
    области памяти.
3166
    области памяти.
3149
 
3167
 
3150
======================================================================
3168
======================================================================
3151
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
3169
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
3152
======================================================================
3170
======================================================================
3153
Параметры:
3171
Параметры:
3154
  * eax = 68 - номер функции
3172
  * eax = 68 - номер функции
3155
  * ebx = 24 - номер подфункции
3173
  * ebx = 24 - номер подфункции
3156
  * ecx = адрес нового обработчика исключений
3174
  * ecx = адрес нового обработчика исключений
3157
  * edx = маска обрабатываемых исключений
3175
  * edx = маска обрабатываемых исключений
3158
Возвращаемое значение:
3176
Возвращаемое значение:
3159
  * eax = адрес старого обработчика исключений (0, если не установлен)
3177
  * eax = адрес старого обработчика исключений (0, если не установлен)
3160
  * ebx = маска старого обработчика исключений
3178
  * ebx = маска старого обработчика исключений
3161
Замечания:
3179
Замечания:
3162
  * Номер бита в маске исключений соответствует номеру исключения по
3180
  * Номер бита в маске исключений соответствует номеру исключения по
3163
    спецификации на процессор (Intel-PC). Так, например, исключения
3181
    спецификации на процессор (Intel-PC). Так, например, исключения
3164
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3182
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3165
  * В данной реализации игнорируется запрос на перехват исключения 7
3183
  * В данной реализации игнорируется запрос на перехват исключения 7
3166
    - система обрабатывает #NM самостоятельно.
3184
    - система обрабатывает #NM самостоятельно.
3167
  * Пользовательский обработчик получает номер исключения параметром
3185
  * Пользовательский обработчик получает номер исключения параметром
3168
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3186
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3169
    при этом производится на команду, вызвавшую исключение.
3187
    при этом производится на команду, вызвавшую исключение.
3170
  * При передаче управления обработчику исключений сбрасывается
3188
  * При передаче управления обработчику исключений сбрасывается
3171
    соответствующий бит в маске исключений. Возникновение этого же
3189
    соответствующий бит в маске исключений. Возникновение этого же
3172
    исключения впоследствии приведёт к умолчальной обработке такового.
3190
    исключения впоследствии приведёт к умолчальной обработке такового.
3173
    А именно: к завершению работы приложения в отсутствии отладчика,
3191
    А именно: к завершению работы приложения в отсутствии отладчика,
3174
    приостановка с уведомлением отлаживающего приложения иначе.
3192
    приостановка с уведомлением отлаживающего приложения иначе.
3175
  * После завершения критических действий в обработчике пользователя
3193
  * После завершения критических действий в обработчике пользователя
3176
    восстановление бита маски данного исключения можно сделать
3194
    восстановление бита маски данного исключения можно сделать
3177
    подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также
3195
    подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также
3178
    возлагается на обработчик пользователя.
3196
    возлагается на обработчик пользователя.
3179
 
3197
 
3180
======================================================================
3198
======================================================================
3181
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
3199
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
3182
======================================================================
3200
======================================================================
3183
Параметры:
3201
Параметры:
3184
  * eax = 68 - номер функции
3202
  * eax = 68 - номер функции
3185
  * ebx = 25 - номер подфункции
3203
  * ebx = 25 - номер подфункции
3186
  * ecx = номер сигнала
3204
  * ecx = номер сигнала
3187
  * edx = значение устанавливаемой активности (0/1)
3205
  * edx = значение устанавливаемой активности (0/1)
3188
Возвращаемое значение:
3206
Возвращаемое значение:
3189
  * eax = -1 - задан неверный номер сигнала
3207
  * eax = -1 - задан неверный номер сигнала
3190
  * иначе eax = старое значение активности сигнала (0/1)
3208
  * иначе eax = старое значение активности сигнала (0/1)
3191
Замечания:
3209
Замечания:
3192
  * В текущей реализации изменяется только маска пользовательского
3210
  * В текущей реализации изменяется только маска пользовательского
3193
    обработчика исключений, установленного подфункцией 24. При этом
3211
    обработчика исключений, установленного подфункцией 24. При этом
3194
    номер сигнала соответствует номеру исключения.
3212
    номер сигнала соответствует номеру исключения.
3195
 
3213
 
3196
======================================================================
3214
======================================================================
3197
= Функция 68, подфункция 26 - освободить страницы памяти ============
3215
= Функция 68, подфункция 26 - освободить страницы памяти ============
3198
======================================================================
3216
======================================================================
3199
Параметры:
3217
Параметры:
3200
  * eax = 68 - номер функции
3218
  * eax = 68 - номер функции
3201
  * ebx = 26 - номер подфункции
3219
  * ebx = 26 - номер подфункции
3202
  * ecx = указатель на блок памяти выделенный подфункцией 12
3220
  * ecx = указатель на блок памяти выделенный подфункцией 12
3203
  * edx = смещение от начала блока
3221
  * edx = смещение от начала блока
3204
  * esi = размер высвобождаемого блока памяти, в байтах
3222
  * esi = размер высвобождаемого блока памяти, в байтах
3205
Примечания:
3223
Примечания:
3206
  * функция освобождает страницы с ecx+edx по ecx+edx+esi
3224
  * функция освобождает страницы с ecx+edx по ecx+edx+esi
3207
    и устанавливает виртуальную память в зарезервированное состояние.
3225
    и устанавливает виртуальную память в зарезервированное состояние.
3208
 
3226
 
3209
======================================================================
3227
======================================================================
3210
= Функция 68, подфункция 27 - загрузить файл ===================
3228
= Функция 68, подфункция 27 - загрузить файл ===================
3211
======================================================================
3229
======================================================================
3212
Параметры:
3230
Параметры:
3213
  * eax = 68 - номер функции
3231
  * eax = 68 - номер функции
3214
  * ebx = 27 - номер подфункции
3232
  * ebx = 27 - номер подфункции
3215
  * ecx = указатель на ASCIIZ-строку с именем файла
3233
  * ecx = указатель на ASCIIZ-строку с именем файла
3216
Возвращаемое значение:
3234
Возвращаемое значение:
3217
  * eax = указатель на загруженный файл или 0
3235
  * eax = указатель на загруженный файл или 0
3218
  * edx = размер загруженного файла или 0
3236
  * edx = размер загруженного файла или 0
3219
Примечания:
3237
Примечания:
3220
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
3238
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
3221
 
3239
 
3222
======================================================================
3240
======================================================================
3223
======================== Функция 69 - отладка. =======================
3241
======================== Функция 69 - отладка. =======================
3224
======================================================================
3242
======================================================================
3225
Процесс может загрузить другой процесс как отлаживаемый установкой
3243
Процесс может загрузить другой процесс как отлаживаемый установкой
3226
соответствующего бита при вызове подфункции 7 функции 70.
3244
соответствующего бита при вызове подфункции 7 функции 70.
3227
У процесса может быть только один отладчик; один процесс может
3245
У процесса может быть только один отладчик; один процесс может
3228
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3246
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3229
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3247
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3230
определённый подфункцией 0.
3248
определённый подфункцией 0.
3231
Формат сообщения:
3249
Формат сообщения:
3232
  * +0: dword: код сообщения
3250
  * +0: dword: код сообщения
3233
  * +4: dword: PID отлаживаемого процесса
3251
  * +4: dword: PID отлаживаемого процесса
3234
  * +8: могут присутствовать дополнительные данные,
3252
  * +8: могут присутствовать дополнительные данные,
3235
    определяемые кодом сообщения
3253
    определяемые кодом сообщения
3236
Коды сообщений:
3254
Коды сообщений:
3237
  * 1 = исключение
3255
  * 1 = исключение
3238
    * дополнительно передаётся dword-номер исключения
3256
    * дополнительно передаётся dword-номер исключения
3239
    * процесс приостановлен
3257
    * процесс приостановлен
3240
  * 2 = процесс завершился
3258
  * 2 = процесс завершился
3241
    * приходит при любом завершении: как через системную функцию -1,
3259
    * приходит при любом завершении: как через системную функцию -1,
3242
      так и при "убийстве" любым другим процессом
3260
      так и при "убийстве" любым другим процессом
3243
      (в том числе самим отладчиком)
3261
      (в том числе самим отладчиком)
3244
  * 3 = отладочное исключение int 1 = #DB
3262
  * 3 = отладочное исключение int 1 = #DB
3245
    * дополнительно передаётся dword-образ регистра DR6:
3263
    * дополнительно передаётся dword-образ регистра DR6:
3246
      * биты 0-3: выполнено условие соответствующей точки останова
3264
      * биты 0-3: выполнено условие соответствующей точки останова
3247
        (установленной подфункцией 9)
3265
        (установленной подфункцией 9)
3248
      * бит 14: исключение произошло из-за режима
3266
      * бит 14: исключение произошло из-за режима
3249
        пошаговой трассировки (установлен флаг TF)
3267
        пошаговой трассировки (установлен флаг TF)
3250
    * процесс приостановлен
3268
    * процесс приостановлен
3251
При завершении отладчика прибиваются все отлаживаемые процессы.
3269
При завершении отладчика прибиваются все отлаживаемые процессы.
3252
Если отладчик этого не хочет, он должен предварительно отключиться
3270
Если отладчик этого не хочет, он должен предварительно отключиться
3253
подфункцией 3.
3271
подфункцией 3.
3254
 
3272
 
3255
Все подфункции применимы только к процессам/потокам, запущенным
3273
Все подфункции применимы только к процессам/потокам, запущенным
3256
из текущего функцией 70 с установленным флагом отладки.
3274
из текущего функцией 70 с установленным флагом отладки.
3257
Отладка многопоточных программ пока не поддерживается.
3275
Отладка многопоточных программ пока не поддерживается.
3258
Полный список подфункций:
3276
Полный список подфункций:
3259
  * подфункция 0 - определить область данных для отладочных сообщений
3277
  * подфункция 0 - определить область данных для отладочных сообщений
3260
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3278
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3261
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3279
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3262
  * подфункция 3 - отключиться от отлаживаемого процесса
3280
  * подфункция 3 - отключиться от отлаживаемого процесса
3263
  * подфункция 4 - приостановить отлаживаемый поток
3281
  * подфункция 4 - приостановить отлаживаемый поток
3264
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3282
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3265
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3283
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3266
  * подфункция 7 - записать в память отлаживаемого процесса
3284
  * подфункция 7 - записать в память отлаживаемого процесса
3267
  * подфункция 8 - завершить отлаживаемый поток
3285
  * подфункция 8 - завершить отлаживаемый поток
3268
  * подфункция 9 - установить/снять аппаратную точку останова
3286
  * подфункция 9 - установить/снять аппаратную точку останова
3269
 
3287
 
3270
======================================================================
3288
======================================================================
3271
====================== Функция 69, подфункция 0 ======================
3289
====================== Функция 69, подфункция 0 ======================
3272
========= Определить область данных для отладочных сообщений. ========
3290
========= Определить область данных для отладочных сообщений. ========
3273
======================================================================
3291
======================================================================
3274
Параметры:
3292
Параметры:
3275
  * eax = 69 - номер функции
3293
  * eax = 69 - номер функции
3276
  * ebx = 0 - номер подфункции
3294
  * ebx = 0 - номер подфункции
3277
  * ecx = указатель
3295
  * ecx = указатель
3278
Формат области данных:
3296
Формат области данных:
3279
  * +0: dword: N = размер буфера (не считая этого заголовка)
3297
  * +0: dword: N = размер буфера (не считая этого заголовка)
3280
  * +4: dword: занято в буфере
3298
  * +4: dword: занято в буфере
3281
  * +8: N*byte: буфер
3299
  * +8: N*byte: буфер
3282
Возвращаемое значение:
3300
Возвращаемое значение:
3283
  * функция не возвращает значения
3301
  * функция не возвращает значения
3284
Замечания:
3302
Замечания:
3285
  * Если поле размера отрицательно, буфер считается заблокированным
3303
  * Если поле размера отрицательно, буфер считается заблокированным
3286
    и при поступлении нового сообщения система будет ждать.
3304
    и при поступлении нового сообщения система будет ждать.
3287
    Для синхронизации обрамляйте всю работу с буфером операциями
3305
    Для синхронизации обрамляйте всю работу с буфером операциями
3288
    блокировки/разблокировки
3306
    блокировки/разблокировки
3289
    	neg	[bufsize]
3307
    	neg	[bufsize]
3290
  * Данные в буфере трактуются как массив элементов переменной длины -
3308
  * Данные в буфере трактуются как массив элементов переменной длины -
3291
    сообщений. Формат сообщения указан в общем описании.
3309
    сообщений. Формат сообщения указан в общем описании.
3292
 
3310
 
3293
======================================================================
3311
======================================================================
3294
====================== Функция 69, подфункция 1 ======================
3312
====================== Функция 69, подфункция 1 ======================
3295
========= Получить состояние регистров отлаживаемого потока. =========
3313
========= Получить состояние регистров отлаживаемого потока. =========
3296
======================================================================
3314
======================================================================
3297
Параметры:
3315
Параметры:
3298
  * eax = 69 - номер функции
3316
  * eax = 69 - номер функции
3299
  * ebx = 1 - номер подфункции
3317
  * ebx = 1 - номер подфункции
3300
  * ecx = идентификатор потока
3318
  * ecx = идентификатор потока
3301
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3319
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3302
  * esi = указатель на структуру контекста
3320
  * esi = указатель на структуру контекста
3303
Возвращаемое значение:
3321
Возвращаемое значение:
3304
  * функция не возвращает значения
3322
  * функция не возвращает значения
3305
Формат структуры контекста: (FPU пока не поддерживается)
3323
Формат структуры контекста: (FPU пока не поддерживается)
3306
  * +0: dword: eip
3324
  * +0: dword: eip
3307
  * +4: dword: eflags
3325
  * +4: dword: eflags
3308
  * +8: dword: eax
3326
  * +8: dword: eax
3309
  * +12 = +0xC: dword: ecx
3327
  * +12 = +0xC: dword: ecx
3310
  * +16 = +0x10: dword: edx
3328
  * +16 = +0x10: dword: edx
3311
  * +20 = +0x14: dword: ebx
3329
  * +20 = +0x14: dword: ebx
3312
  * +24 = +0x18: dword: esp
3330
  * +24 = +0x18: dword: esp
3313
  * +28 = +0x1C: dword: ebp
3331
  * +28 = +0x1C: dword: ebp
3314
  * +32 = +0x20: dword: esi
3332
  * +32 = +0x20: dword: esi
3315
  * +36 = +0x24: dword: edi
3333
  * +36 = +0x24: dword: edi
3316
Замечания:
3334
Замечания:
3317
  * Если поток выполняет код 0-кольца, возвращается
3335
  * Если поток выполняет код 0-кольца, возвращается
3318
    состояние регистров 3-кольца.
3336
    состояние регистров 3-кольца.
3319
  * Процесс должен быть загружен для отладки (как указано в
3337
  * Процесс должен быть загружен для отладки (как указано в
3320
    общем описании).
3338
    общем описании).
3321
 
3339
 
3322
======================================================================
3340
======================================================================
3323
====================== Функция 69, подфункция 2 ======================
3341
====================== Функция 69, подфункция 2 ======================
3324
======== Установить состояние регистров отлаживаемого потока. ========
3342
======== Установить состояние регистров отлаживаемого потока. ========
3325
======================================================================
3343
======================================================================
3326
Параметры:
3344
Параметры:
3327
  * eax = 69 - номер функции
3345
  * eax = 69 - номер функции
3328
  * ebx = 2 - номер подфункции
3346
  * ebx = 2 - номер подфункции
3329
  * ecx = идентификатор потока
3347
  * ecx = идентификатор потока
3330
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3348
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3331
  * esi = указатель на структуру контекста
3349
  * esi = указатель на структуру контекста
3332
Возвращаемое значение:
3350
Возвращаемое значение:
3333
  * функция не возвращает значения
3351
  * функция не возвращает значения
3334
Формат структуры контекста указан в описании подфункции 1.
3352
Формат структуры контекста указан в описании подфункции 1.
3335
Замечания:
3353
Замечания:
3336
  * Если поток выполняет код 0-кольца, устанавливается
3354
  * Если поток выполняет код 0-кольца, устанавливается
3337
    состояние регистров 3-кольца.
3355
    состояние регистров 3-кольца.
3338
  * Процесс должен быть загружен для отладки (как указано в
3356
  * Процесс должен быть загружен для отладки (как указано в
3339
    общем описании).
3357
    общем описании).
3340
 
3358
 
3341
======================================================================
3359
======================================================================
3342
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
3360
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
3343
======================================================================
3361
======================================================================
3344
Параметры:
3362
Параметры:
3345
  * eax = 69 - номер функции
3363
  * eax = 69 - номер функции
3346
  * ebx = 3 - номер подфункции
3364
  * ebx = 3 - номер подфункции
3347
  * ecx = идентификатор
3365
  * ecx = идентификатор
3348
Возвращаемое значение:
3366
Возвращаемое значение:
3349
  * функция не возвращает значения
3367
  * функция не возвращает значения
3350
Замечания:
3368
Замечания:
3351
  * Если процесс был приостановлен, он возобновляет выполнение.
3369
  * Если процесс был приостановлен, он возобновляет выполнение.
3352
 
3370
 
3353
======================================================================
3371
======================================================================
3354
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
3372
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
3355
======================================================================
3373
======================================================================
3356
Параметры:
3374
Параметры:
3357
  * eax = 69 - номер процесса
3375
  * eax = 69 - номер процесса
3358
  * ebx = 4 - номер подфункции
3376
  * ebx = 4 - номер подфункции
3359
  * ecx = идентификатор
3377
  * ecx = идентификатор
3360
Возвращаемое значение:
3378
Возвращаемое значение:
3361
  * функция не возвращает значения
3379
  * функция не возвращает значения
3362
Замечания:
3380
Замечания:
3363
  * Процесс должен быть загружен для отладки (как указано в
3381
  * Процесс должен быть загружен для отладки (как указано в
3364
    общем описании).
3382
    общем описании).
3365
 
3383
 
3366
======================================================================
3384
======================================================================
3367
====================== Функция 69, подфункция 5 ======================
3385
====================== Функция 69, подфункция 5 ======================
3368
============ Возобновить выполнение отлаживаемого потока. ============
3386
============ Возобновить выполнение отлаживаемого потока. ============
3369
======================================================================
3387
======================================================================
3370
Параметры:
3388
Параметры:
3371
  * eax = 69 - номер функции
3389
  * eax = 69 - номер функции
3372
  * ebx = 5 - номер подфункции
3390
  * ebx = 5 - номер подфункции
3373
  * ecx = идентификатор
3391
  * ecx = идентификатор
3374
Возвращаемое значение:
3392
Возвращаемое значение:
3375
  * функция не возвращает значения
3393
  * функция не возвращает значения
3376
Замечания:
3394
Замечания:
3377
  * Процесс должен быть загружен для отладки (как указано в
3395
  * Процесс должен быть загружен для отладки (как указано в
3378
    общем описании).
3396
    общем описании).
3379
 
3397
 
3380
======================================================================
3398
======================================================================
3381
====================== Функция 69, подфункция 6 ======================
3399
====================== Функция 69, подфункция 6 ======================
3382
============= Прочитать из памяти отлаживаемого процесса. ============
3400
============= Прочитать из памяти отлаживаемого процесса. ============
3383
======================================================================
3401
======================================================================
3384
Параметры:
3402
Параметры:
3385
  * eax = 69 - номер функции
3403
  * eax = 69 - номер функции
3386
  * ebx = 6 - номер подфункции
3404
  * ebx = 6 - номер подфункции
3387
  * ecx = идентификатор
3405
  * ecx = идентификатор
3388
  * edx = сколько байт читать
3406
  * edx = сколько байт читать
3389
  * esi = адрес памяти отлаживаемого процесса
3407
  * esi = адрес памяти отлаживаемого процесса
3390
  * edi = указатель на буфер для данных
3408
  * edi = указатель на буфер для данных
3391
Возвращаемое значение:
3409
Возвращаемое значение:
3392
  * eax = -1 при ошибке (неверный PID или буфер)
3410
  * eax = -1 при ошибке (неверный PID или буфер)
3393
  * иначе eax = число прочитанных байт (возможно, 0,
3411
  * иначе eax = число прочитанных байт (возможно, 0,
3394
    если в esi слишком большое значение)
3412
    если в esi слишком большое значение)
3395
Замечания:
3413
Замечания:
3396
  * Процесс должен быть загружен для отладки (как указано в
3414
  * Процесс должен быть загружен для отладки (как указано в
3397
    общем описании).
3415
    общем описании).
3398
 
3416
 
3399
======================================================================
3417
======================================================================
3400
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
3418
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
3401
======================================================================
3419
======================================================================
3402
Параметры:
3420
Параметры:
3403
  * eax = 69 - номер функции
3421
  * eax = 69 - номер функции
3404
  * ebx = 7 - номер подфункции
3422
  * ebx = 7 - номер подфункции
3405
  * ecx = идентификатор
3423
  * ecx = идентификатор
3406
  * edx = сколько байт писать
3424
  * edx = сколько байт писать
3407
  * esi = адрес памяти в отлаживаемом процессе
3425
  * esi = адрес памяти в отлаживаемом процессе
3408
  * edi = указатель на данные
3426
  * edi = указатель на данные
3409
Возвращаемое значение:
3427
Возвращаемое значение:
3410
  * eax = -1 при ошибке (неверный PID или буфер)
3428
  * eax = -1 при ошибке (неверный PID или буфер)
3411
  * иначе eax = число записанных байт (возможно, 0,
3429
  * иначе eax = число записанных байт (возможно, 0,
3412
    если в esi слишком большое значение)
3430
    если в esi слишком большое значение)
3413
Замечания:
3431
Замечания:
3414
  * Процесс должен быть загружен для отладки (как указано в
3432
  * Процесс должен быть загружен для отладки (как указано в
3415
    общем описании).
3433
    общем описании).
3416
 
3434
 
3417
======================================================================
3435
======================================================================
3418
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
3436
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
3419
======================================================================
3437
======================================================================
3420
Параметры:
3438
Параметры:
3421
  * eax = 69 - номер функции
3439
  * eax = 69 - номер функции
3422
  * ebx = 8 - номер подфункции
3440
  * ebx = 8 - номер подфункции
3423
  * ecx = идентификатор
3441
  * ecx = идентификатор
3424
Возвращаемое значение:
3442
Возвращаемое значение:
3425
  * функция не возвращает значения
3443
  * функция не возвращает значения
3426
Замечания:
3444
Замечания:
3427
  * Процесс должен быть загружен для отладки (как указано в
3445
  * Процесс должен быть загружен для отладки (как указано в
3428
    общем описании).
3446
    общем описании).
3429
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3447
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3430
    требуется выполнение первого замечания и принимается PID,
3448
    требуется выполнение первого замечания и принимается PID,
3431
    а не номер слота.
3449
    а не номер слота.
3432
 
3450
 
3433
======================================================================
3451
======================================================================
3434
====================== Функция 69, подфункция 9 ======================
3452
====================== Функция 69, подфункция 9 ======================
3435
============= Установить/снять аппаратную точку останова. ============
3453
============= Установить/снять аппаратную точку останова. ============
3436
======================================================================
3454
======================================================================
3437
Параметры:
3455
Параметры:
3438
  * eax = 69 - номер функции
3456
  * eax = 69 - номер функции
3439
  * ebx = 9 - номер подфункции
3457
  * ebx = 9 - номер подфункции
3440
  * ecx = идентификатор потока
3458
  * ecx = идентификатор потока
3441
  * dl = индекс точки останова, от 0 до 3 включительно
3459
  * dl = индекс точки останова, от 0 до 3 включительно
3442
  * dh = флаги:
3460
  * dh = флаги:
3443
    * если старший бит сброшен - установить точку останова:
3461
    * если старший бит сброшен - установить точку останова:
3444
      * биты 0-1 - условие:
3462
      * биты 0-1 - условие:
3445
        * 00 = точка останова на выполнение
3463
        * 00 = точка останова на выполнение
3446
        * 01 = точка останова на запись
3464
        * 01 = точка останова на запись
3447
        * 11 = точка останова на чтение/запись
3465
        * 11 = точка останова на чтение/запись
3448
      * биты 2-3 - длина; для точек останова на исполнение должно быть
3466
      * биты 2-3 - длина; для точек останова на исполнение должно быть
3449
        00, в противном случае одно из
3467
        00, в противном случае одно из
3450
        * 00 = байт
3468
        * 00 = байт
3451
        * 01 = слово
3469
        * 01 = слово
3452
        * 11 = двойное слово
3470
        * 11 = двойное слово
3453
      * esi = адрес точки останова; должен быть выровнен
3471
      * esi = адрес точки останова; должен быть выровнен
3454
        соответственно длине (т.е. должен быть чётным для
3472
        соответственно длине (т.е. должен быть чётным для
3455
        точек останова на слово, кратен 4 для двойного слова)
3473
        точек останова на слово, кратен 4 для двойного слова)
3456
    * если старший бит установлен - сбросить точку останова
3474
    * если старший бит установлен - сбросить точку останова
3457
Возвращаемое значение:
3475
Возвращаемое значение:
3458
  * eax = 0 - успешно
3476
  * eax = 0 - успешно
3459
  * eax = 1 - ошибка во входных данных
3477
  * eax = 1 - ошибка во входных данных
3460
  * eax = 2 - (зарезервировано, никогда не возвращается
3478
  * eax = 2 - (зарезервировано, никогда не возвращается
3461
    в текущей реализации) с этим индексом уже установлена
3479
    в текущей реализации) с этим индексом уже установлена
3462
    глобальная точка останова
3480
    глобальная точка останова
3463
Замечания:
3481
Замечания:
3464
  * Процесс должен быть загружен для отладки (как указано в
3482
  * Процесс должен быть загружен для отладки (как указано в
3465
    общем описании).
3483
    общем описании).
3466
  * Аппаратные точки останова реализуются через DRx-регистры
3484
  * Аппаратные точки останова реализуются через DRx-регистры
3467
    процессора, отсюда все ограничения.
3485
    процессора, отсюда все ограничения.
3468
  * Функция может переустановить ранее установленную ей же
3486
  * Функция может переустановить ранее установленную ей же
3469
    точку останова (никак не сообщая об этом).
3487
    точку останова (никак не сообщая об этом).
3470
    Ведите список установленных точек останова в отладчике.
3488
    Ведите список установленных точек останова в отладчике.
3471
  * Срабатывание точки останова заключается в генерировании
3489
  * Срабатывание точки останова заключается в генерировании
3472
    отладочного исключения #DB, о котором система сообщает отладчику.
3490
    отладочного исключения #DB, о котором система сообщает отладчику.
3473
  * Точка останова на запись и чтение/запись срабатывает после
3491
  * Точка останова на запись и чтение/запись срабатывает после
3474
    выполнения вызвавшей её инструкции.
3492
    выполнения вызвавшей её инструкции.
3475
 
3493
 
3476
======================================================================
3494
======================================================================
3477
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
3495
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
3478
======================================================================
3496
======================================================================
3479
Параметры:
3497
Параметры:
3480
  * eax = 70
3498
  * eax = 70
3481
  * ebx = указатель на информационную структуру
3499
  * ebx = указатель на информационную структуру
3482
Возвращаемое значение:
3500
Возвращаемое значение:
3483
  * eax = 0 - успешно; иначе код ошибки файловой системы
3501
  * eax = 0 - успешно; иначе код ошибки файловой системы
3484
  * в зависимости от подфункции может возвращаться значение и
3502
  * в зависимости от подфункции может возвращаться значение и
3485
    в других регистрах
3503
    в других регистрах
3486
Общий формат информационной структуры:
3504
Общий формат информационной структуры:
3487
  * +0: dword: номер подфункции
3505
  * +0: dword: номер подфункции
3488
  * +4: dword: смещение в файле
3506
  * +4: dword: смещение в файле
3489
  * +8: dword: старший dword смещения (должен быть 0) или поле флагов
3507
  * +8: dword: старший dword смещения (должен быть 0) или поле флагов
3490
  * +12 = +0xC: dword: размер
3508
  * +12 = +0xC: dword: размер
3491
  * +16 = +0x10: dword: указатель на данные
3509
  * +16 = +0x10: dword: указатель на данные
3492
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
3510
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
3493
    или
3511
    или
3494
  * +20 = +0x14: db 0
3512
  * +20 = +0x14: db 0
3495
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3513
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3496
Уточнения - в документации на соответствующую подфункцию.
3514
Уточнения - в документации на соответствующую подфункцию.
3497
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
3515
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
3498
записаны в кодировке cp866 (DOS).
3516
записаны в кодировке cp866 (DOS).
3499
Формат имени файла:
3517
Формат имени файла:
3500
/base/number/dir1/dir2/.../dirn/file,
3518
/base/number/dir1/dir2/.../dirn/file,
3501
где /base/number идентифицирует устройство, на котором ищется файл:
3519
где /base/number идентифицирует устройство, на котором ищется файл:
3502
одно из
3520
одно из
3503
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
3521
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
3504
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
3522
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
3505
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
3523
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
3506
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
3524
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
3507
    к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave),
3525
    к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave),
3508
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
3526
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
3509
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
3527
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
3510
    (на каждом из винчестеров нумерация начинается с 1)
3528
    (на каждом из винчестеров нумерация начинается с 1)
3511
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно
3529
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно
3512
    к CD на IDE0 (Primary Master), IDE1 (Primary Slave),
3530
    к CD на IDE0 (Primary Master), IDE1 (Primary Slave),
3513
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
3531
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
3514
  * /SYS - определяет системную папку; при обычной загрузке системы
3532
  * /SYS - определяет системную папку; при обычной загрузке системы
3515
    с дискеты эквивалентно /RD/1
3533
    с дискеты эквивалентно /RD/1
3516
Примеры:
3534
Примеры:
3517
  * '/rd/1/kernel.asm',0
3535
  * '/rd/1/kernel.asm',0
3518
  * '/HD0/1/kernel.asm',0
3536
  * '/HD0/1/kernel.asm',0
3519
  * '/hd0/2/menuet/pics/tanzania.bmp',0
3537
  * '/hd0/2/menuet/pics/tanzania.bmp',0
3520
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
3538
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
3521
  * '/sys/MySuperApp.ini',0
3539
  * '/sys/MySuperApp.ini',0
3522
Также функция поддерживает относительные имена. Если путь начинается
3540
Также функция поддерживает относительные имена. Если путь начинается
3523
не с '/', то он считается относительно текущей папки. Получить или
3541
не с '/', то он считается относительно текущей папки. Получить или
3524
установить текущую папку можно с помощью сисфункции 30.
3542
установить текущую папку можно с помощью сисфункции 30.
3525
 
3543
 
3526
Доступные подфункции:
3544
Доступные подфункции:
3527
  * подфункция 0 - чтение файла
3545
  * подфункция 0 - чтение файла
3528
  * подфункция 1 - чтение папки
3546
  * подфункция 1 - чтение папки
3529
  * подфункция 2 - создание/перезапись файла
3547
  * подфункция 2 - создание/перезапись файла
3530
  * подфункция 3 - запись в существующий файл
3548
  * подфункция 3 - запись в существующий файл
3531
  * подфункция 4 - установка размера файла
3549
  * подфункция 4 - установка размера файла
3532
  * подфункция 5 - получение атрибутов файла/папки
3550
  * подфункция 5 - получение атрибутов файла/папки
3533
  * подфункция 6 - установка атрибутов файла/папки
3551
  * подфункция 6 - установка атрибутов файла/папки
3534
  * подфункция 7 - запуск программы
3552
  * подфункция 7 - запуск программы
3535
  * подфункция 8 - удаление файла/папки
3553
  * подфункция 8 - удаление файла/папки
3536
  * подфункция 9 - создание папки
3554
  * подфункция 9 - создание папки
3537
Для CD-приводов в связи с аппаратными ограничениями доступны
3555
Для CD-приводов в связи с аппаратными ограничениями доступны
3538
только подфункции 0,1,5 и 7, вызов других подфункций завершится
3556
только подфункции 0,1,5 и 7, вызов других подфункций завершится
3539
ошибкой с кодом 2.
3557
ошибкой с кодом 2.
3540
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
3558
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
3541
(CD и DVD) производится блокировка ручного управления механизмом
3559
(CD и DVD) производится блокировка ручного управления механизмом
3542
лотка. Это связано с кэшированием данных, полученных от привода.
3560
лотка. Это связано с кэшированием данных, полученных от привода.
3543
Разблокировка осуществляется при обращении подфункции 4 функции 24
3561
Разблокировка осуществляется при обращении подфункции 4 функции 24
3544
к соответствующему устройству.
3562
к соответствующему устройству.
3545
 
3563
 
3546
======================================================================
3564
======================================================================
3547
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
3565
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
3548
======================================================================
3566
======================================================================
3549
Параметры:
3567
Параметры:
3550
  * eax = 70 - номер функции
3568
  * eax = 70 - номер функции
3551
  * ebx = указатель на информационную структуру
3569
  * ebx = указатель на информационную структуру
3552
Формат информационной структуры:
3570
Формат информационной структуры:
3553
  * +0: dword: 0 = номер подфункции
3571
  * +0: dword: 0 = номер подфункции
3554
  * +4: dword: позиция в файле (в байтах)
3572
  * +4: dword: позиция в файле (в байтах)
3555
  * +8: dword: 0 (зарезервировано под старший dword позиции)
3573
  * +8: dword: 0 (зарезервировано под старший dword позиции)
3556
  * +12 = +0xC: dword: сколько байт читать
3574
  * +12 = +0xC: dword: сколько байт читать
3557
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
3575
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
3558
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3576
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3559
    общем описании
3577
    общем описании
3560
    или
3578
    или
3561
  * +20 = +0x14: db 0
3579
  * +20 = +0x14: db 0
3562
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3580
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3563
Возвращаемое значение:
3581
Возвращаемое значение:
3564
  * eax = 0 - успешно, иначе код ошибки файловой системы
3582
  * eax = 0 - успешно, иначе код ошибки файловой системы
3565
  * ebx = число прочитанных байт или
3583
  * ebx = число прочитанных байт или
3566
    -1=0xffffffff, если файл не найден
3584
    -1=0xffffffff, если файл не найден
3567
Замечания:
3585
Замечания:
3568
  * Если файл кончился раньше, чем был прочитан последний запрошенный
3586
  * Если файл кончился раньше, чем был прочитан последний запрошенный
3569
    блок, то функция прочитает, сколько сможет, после чего вернёт
3587
    блок, то функция прочитает, сколько сможет, после чего вернёт
3570
    eax=6 (EOF).
3588
    eax=6 (EOF).
3571
  * Функция не позволяет читать папки
3589
  * Функция не позволяет читать папки
3572
    (вернётся eax=10, access denied).
3590
    (вернётся eax=10, access denied).
3573
 
3591
 
3574
======================================================================
3592
======================================================================
3575
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
3593
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
3576
======================================================================
3594
======================================================================
3577
Параметры:
3595
Параметры:
3578
  * eax = 70 - номер функции
3596
  * eax = 70 - номер функции
3579
  * ebx = указатель на информационную структуру
3597
  * ebx = указатель на информационную структуру
3580
Формат информационной структуры:
3598
Формат информационной структуры:
3581
  * +0: dword: 1 = номер подфункции
3599
  * +0: dword: 1 = номер подфункции
3582
  * +4: dword: индекс начального блока (считая с 0)
3600
  * +4: dword: индекс начального блока (считая с 0)
3583
  * +8: dword: поле флагов:
3601
  * +8: dword: поле флагов:
3584
    * бит 0 (маска 1): в каком формате возвращать имена,
3602
    * бит 0 (маска 1): в каком формате возвращать имена,
3585
      0=ANSI, 1=UNICODE
3603
      0=ANSI, 1=UNICODE
3586
    * прочие биты зарезервированы и должны быть установлены в 0
3604
    * прочие биты зарезервированы и должны быть установлены в 0
3587
      для будущей совместимости
3605
      для будущей совместимости
3588
  * +12 = +0xC: dword: сколько блоков читать
3606
  * +12 = +0xC: dword: сколько блоков читать
3589
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
3607
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
3590
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
3608
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
3591
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
3609
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
3592
    общем описании
3610
    общем описании
3593
    или
3611
    или
3594
  * +20 = +0x14: db 0
3612
  * +20 = +0x14: db 0
3595
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3613
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3596
Возвращаемое значение:
3614
Возвращаемое значение:
3597
  * eax = 0 - успешно, иначе код ошибки файловой системы
3615
  * eax = 0 - успешно, иначе код ошибки файловой системы
3598
  * ebx = число файлов, информация о которых была записана в буфер,
3616
  * ebx = число файлов, информация о которых была записана в буфер,
3599
    или -1=0xffffffff, если папка не найдена
3617
    или -1=0xffffffff, если папка не найдена
3600
Структура буфера:
3618
Структура буфера:
3601
  * +0: 32*byte: заголовок
3619
  * +0: 32*byte: заголовок
3602
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
3620
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
3603
  * +32+n1: n2*byte: блок с информацией о файле 2
3621
  * +32+n1: n2*byte: блок с информацией о файле 2
3604
  * ...
3622
  * ...
3605
Структура заголовка:
3623
Структура заголовка:
3606
  * +0: dword: версия структуры (текущая версия = 1)
3624
  * +0: dword: версия структуры (текущая версия = 1)
3607
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
3625
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
3608
    в поле +12 информационной структуры; может быть меньше,
3626
    в поле +12 информационной структуры; может быть меньше,
3609
    если в папке кончились файлы (то же самое, что и в ebx)
3627
    если в папке кончились файлы (то же самое, что и в ebx)
3610
  * +8: dword: общее число файлов в папке
3628
  * +8: dword: общее число файлов в папке
3611
  * +12 = +0xC: 20*byte: зарезервировано (нули)
3629
  * +12 = +0xC: 20*byte: зарезервировано (нули)
3612
Структура блока данных входа каталога (БДВК):
3630
Структура блока данных входа каталога (БДВК):
3613
  * +0: dword: атрибуты файла:
3631
  * +0: dword: атрибуты файла:
3614
    * бит 0 (маска 1): файл только для чтения
3632
    * бит 0 (маска 1): файл только для чтения
3615
    * бит 1 (маска 2): файл является скрытым
3633
    * бит 1 (маска 2): файл является скрытым
3616
    * бит 2 (маска 4): файл является системным
3634
    * бит 2 (маска 4): файл является системным
3617
    * бит 3 (маска 8): это не файл, а метка тома
3635
    * бит 3 (маска 8): это не файл, а метка тома
3618
      (на заданном разделе встречается не более одного раза и
3636
      (на заданном разделе встречается не более одного раза и
3619
      только в корневой папке)
3637
      только в корневой папке)
3620
    * бит 4 (маска 0x10): это папка
3638
    * бит 4 (маска 0x10): это папка
3621
    * бит 5 (маска 0x20): файл не архивировался - многие программы
3639
    * бит 5 (маска 0x20): файл не архивировался - многие программы
3622
      архивации имеют опцию, по которой архивируются только файлы
3640
      архивации имеют опцию, по которой архивируются только файлы
3623
      с установленным этим битом, после чего этот бит сбрасывается -
3641
      с установленным этим битом, после чего этот бит сбрасывается -
3624
      это может быть полезно для автоматического создания
3642
      это может быть полезно для автоматического создания
3625
      backup-архивов, ибо при записи бит обычно устанавливается
3643
      backup-архивов, ибо при записи бит обычно устанавливается
3626
      (не в Kolibri, правда)
3644
      (не в Kolibri, правда)
3627
  * +4: byte: тип данных имени:
3645
  * +4: byte: тип данных имени:
3628
    (совпадает с битом 0 флагов информационной структуры)
3646
    (совпадает с битом 0 флагов информационной структуры)
3629
    * 0 = ASCII = 1-байтное представление каждого символа
3647
    * 0 = ASCII = 1-байтное представление каждого символа
3630
    * 1 = UNICODE = 2-байтное представление каждого символа
3648
    * 1 = UNICODE = 2-байтное представление каждого символа
3631
  * +5: 3*byte: зарезервировано (нули)
3649
  * +5: 3*byte: зарезервировано (нули)
3632
  * +8: 4*byte: время создания файла
3650
  * +8: 4*byte: время создания файла
3633
  * +12 = +0xC: 4*byte: дата создания файла
3651
  * +12 = +0xC: 4*byte: дата создания файла
3634
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
3652
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
3635
  * +20 = +0x14: 4*byte: дата последнего доступа
3653
  * +20 = +0x14: 4*byte: дата последнего доступа
3636
  * +24 = +0x18: 4*byte: время последней модификации
3654
  * +24 = +0x18: 4*byte: время последней модификации
3637
  * +28 = +0x1C: 4*byte: дата последней модификации
3655
  * +28 = +0x1C: 4*byte: дата последней модификации
3638
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
3656
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
3639
  * +40 = +0x28: имя
3657
  * +40 = +0x28: имя
3640
    * для формата ASCII: максимальная длина имени 263 символа
3658
    * для формата ASCII: максимальная длина имени 263 символа
3641
      (263 байта), байт после имени имеет значение 0
3659
      (263 байта), байт после имени имеет значение 0
3642
    * для формата UNICODE: максимальная длина имени 259 символов
3660
    * для формата UNICODE: максимальная длина имени 259 символов
3643
      (518 байт), два байта после имени имеют значение 0
3661
      (518 байт), два байта после имени имеют значение 0
3644
Формат времени:
3662
Формат времени:
3645
  * +0: byte: секунды
3663
  * +0: byte: секунды
3646
  * +1: byte: минуты
3664
  * +1: byte: минуты
3647
  * +2: byte: часы
3665
  * +2: byte: часы
3648
  * +3: byte: зарезервировано (0)
3666
  * +3: byte: зарезервировано (0)
3649
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
3667
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
3650
Формат даты:
3668
Формат даты:
3651
  * +0: byte: день
3669
  * +0: byte: день
3652
  * +1: byte: месяц
3670
  * +1: byte: месяц
3653
  * +2: word: год
3671
  * +2: word: год
3654
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
3672
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
3655
Замечания:
3673
Замечания:
3656
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
3674
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
3657
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
3675
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
3658
    на целое кратное 16 байт
3676
    на целое кратное 16 байт
3659
    (для ускорения обработки в кэш-памяти CPU).
3677
    (для ускорения обработки в кэш-памяти CPU).
3660
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
3678
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
3661
    данные содержат мусор.
3679
    данные содержат мусор.
3662
  * Если файлы в папке кончились раньше, чем было прочитано
3680
  * Если файлы в папке кончились раньше, чем было прочитано
3663
    запрошенное количество, то функция прочитает, сколько сможет,
3681
    запрошенное количество, то функция прочитает, сколько сможет,
3664
    после чего вернёт eax=6 (EOF).
3682
    после чего вернёт eax=6 (EOF).
3665
  * Любая папка на диске, кроме корневой, содержит два специальных
3683
  * Любая папка на диске, кроме корневой, содержит два специальных
3666
    входа "." и "..", идентифицирующих соответственно саму папку и
3684
    входа "." и "..", идентифицирующих соответственно саму папку и
3667
    родительскую папку.
3685
    родительскую папку.
3668
  * Функция позволяет также читать виртуальные папки "/", "/rd",
3686
  * Функция позволяет также читать виртуальные папки "/", "/rd",
3669
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
3687
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
3670
    0x10, а времена и даты обнулены. Альтернативный способ получения
3688
    0x10, а времена и даты обнулены. Альтернативный способ получения
3671
    информации об оборудовании - подфункция 11 функции 18.
3689
    информации об оборудовании - подфункция 11 функции 18.
3672
 
3690
 
3673
======================================================================
3691
======================================================================
3674
====================== Функция 70, подфункция 2 ======================
3692
====================== Функция 70, подфункция 2 ======================
3675
======== Создание/перезапись файла с поддержкой длинных имён. ========
3693
======== Создание/перезапись файла с поддержкой длинных имён. ========
3676
======================================================================
3694
======================================================================
3677
Параметры:
3695
Параметры:
3678
  * eax = 70 - номер функции
3696
  * eax = 70 - номер функции
3679
  * ebx = указатель на информационную структуру
3697
  * ebx = указатель на информационную структуру
3680
Формат информационной структуры:
3698
Формат информационной структуры:
3681
  * +0: dword: 2 = номер подфункции
3699
  * +0: dword: 2 = номер подфункции
3682
  * +4: dword: 0 (зарезервировано)
3700
  * +4: dword: 0 (зарезервировано)
3683
  * +8: dword: 0 (зарезервировано)
3701
  * +8: dword: 0 (зарезервировано)
3684
  * +12 = +0xC: dword: сколько байт писать
3702
  * +12 = +0xC: dword: сколько байт писать
3685
  * +16 = +0x10: dword: указатель на данные
3703
  * +16 = +0x10: dword: указатель на данные
3686
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3704
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3687
    общем описании
3705
    общем описании
3688
    или
3706
    или
3689
  * +20 = +0x14: db 0
3707
  * +20 = +0x14: db 0
3690
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3708
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3691
Возвращаемое значение:
3709
Возвращаемое значение:
3692
  * eax = 0 - успешно, иначе код ошибки файловой системы
3710
  * eax = 0 - успешно, иначе код ошибки файловой системы
3693
  * ebx = число записанных байт (возможно, 0)
3711
  * ebx = число записанных байт (возможно, 0)
3694
Замечания:
3712
Замечания:
3695
  * Если файл с таким именем не существовал, он создаётся; если
3713
  * Если файл с таким именем не существовал, он создаётся; если
3696
    существовал, то перезаписывается.
3714
    существовал, то перезаписывается.
3697
  * Если свободного места на диске недостаточно, то функция запишет,
3715
  * Если свободного места на диске недостаточно, то функция запишет,
3698
    сколько сможет, после чего вернёт код ошибки 8.
3716
    сколько сможет, после чего вернёт код ошибки 8.
3699
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3717
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3700
 
3718
 
3701
======================================================================
3719
======================================================================
3702
====================== Функция 70, подфункция 3 ======================
3720
====================== Функция 70, подфункция 3 ======================
3703
======== Запись в существующий файл с поддержкой длинных имён. =======
3721
======== Запись в существующий файл с поддержкой длинных имён. =======
3704
======================================================================
3722
======================================================================
3705
Параметры:
3723
Параметры:
3706
  * eax = 70 - номер функции
3724
  * eax = 70 - номер функции
3707
  * ebx = указатель на информационную структуру
3725
  * ebx = указатель на информационную структуру
3708
Формат информационной структуры:
3726
Формат информационной структуры:
3709
  * +0: dword: 3 = номер подфункции
3727
  * +0: dword: 3 = номер подфункции
3710
  * +4: dword: позиция в файле (в байтах)
3728
  * +4: dword: позиция в файле (в байтах)
3711
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
3729
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
3712
  * +12 = +0xC: dword: сколько байт писать
3730
  * +12 = +0xC: dword: сколько байт писать
3713
  * +16 = +0x10: dword: указатель на данные
3731
  * +16 = +0x10: dword: указатель на данные
3714
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3732
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3715
    общем описании
3733
    общем описании
3716
    или
3734
    или
3717
  * +20 = +0x14: db 0
3735
  * +20 = +0x14: db 0
3718
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3736
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3719
Возвращаемое значение:
3737
Возвращаемое значение:
3720
  * eax = 0 - успешно, иначе код ошибки файловой системы
3738
  * eax = 0 - успешно, иначе код ошибки файловой системы
3721
  * ebx = число записанных байт (возможно, 0)
3739
  * ebx = число записанных байт (возможно, 0)
3722
Замечания:
3740
Замечания:
3723
  * Файл должен уже существовать, иначе вернётся eax=5.
3741
  * Файл должен уже существовать, иначе вернётся eax=5.
3724
  * Единственным результатом записи 0 байт является установка в
3742
  * Единственным результатом записи 0 байт является установка в
3725
    атрибутах файла даты/времени модификации и доступа в текущую.
3743
    атрибутах файла даты/времени модификации и доступа в текущую.
3726
  * Если начальная и/или конечная позиция выходит за пределы файла
3744
  * Если начальная и/или конечная позиция выходит за пределы файла
3727
    (за исключением предыдущего случая), файл расширяется до
3745
    (за исключением предыдущего случая), файл расширяется до
3728
    необходимого размера нулевыми символами.
3746
    необходимого размера нулевыми символами.
3729
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3747
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3730
 
3748
 
3731
======================================================================
3749
======================================================================
3732
========= Функция 70, подфункция 4 - установка размера файла. ========
3750
========= Функция 70, подфункция 4 - установка размера файла. ========
3733
======================================================================
3751
======================================================================
3734
Параметры:
3752
Параметры:
3735
  * eax = 70 - номер функции
3753
  * eax = 70 - номер функции
3736
  * ebx = указатель на информационную структуру
3754
  * ebx = указатель на информационную структуру
3737
Формат информационной структуры:
3755
Формат информационной структуры:
3738
  * +0: dword: 4 = номер подфункции
3756
  * +0: dword: 4 = номер подфункции
3739
  * +4: dword: младший dword нового размера файла
3757
  * +4: dword: младший dword нового размера файла
3740
  * +8: dword: старший dword нового размера файла
3758
  * +8: dword: старший dword нового размера файла
3741
                   (должен быть 0 для FAT)
3759
                   (должен быть 0 для FAT)
3742
  * +12 = +0xC: dword: 0 (зарезервировано)
3760
  * +12 = +0xC: dword: 0 (зарезервировано)
3743
  * +16 = +0x10: dword: 0 (зарезервировано)
3761
  * +16 = +0x10: dword: 0 (зарезервировано)
3744
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3762
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3745
    общем описании
3763
    общем описании
3746
    или
3764
    или
3747
  * +20 = +0x14: db 0
3765
  * +20 = +0x14: db 0
3748
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3766
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3749
Возвращаемое значение:
3767
Возвращаемое значение:
3750
  * eax = 0 - успешно, иначе код ошибки файловой системы
3768
  * eax = 0 - успешно, иначе код ошибки файловой системы
3751
  * ebx разрушается
3769
  * ebx разрушается
3752
Замечания:
3770
Замечания:
3753
  * Если новый размер файла меньше старого, файл усекается. Если
3771
  * Если новый размер файла меньше старого, файл усекается. Если
3754
    новый размер больше старого, файл расширяется нулевыми символами.
3772
    новый размер больше старого, файл расширяется нулевыми символами.
3755
    Если новый размер равен старому, единственным результатом вызова
3773
    Если новый размер равен старому, единственным результатом вызова
3756
    является установка даты/времени модификации и доступа в текущие.
3774
    является установка даты/времени модификации и доступа в текущие.
3757
  * Если свободного места на диске недостаточно для расширения файла,
3775
  * Если свободного места на диске недостаточно для расширения файла,
3758
    то функция расширит насколько возможно, после чего вернёт
3776
    то функция расширит насколько возможно, после чего вернёт
3759
    код ошибки 8.
3777
    код ошибки 8.
3760
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3778
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3761
 
3779
 
3762
======================================================================
3780
======================================================================
3763
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
3781
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
3764
======================================================================
3782
======================================================================
3765
Параметры:
3783
Параметры:
3766
  * eax = 70 - номер функции
3784
  * eax = 70 - номер функции
3767
  * ebx = указатель на информационную структуру
3785
  * ebx = указатель на информационную структуру
3768
Формат информационной структуры:
3786
Формат информационной структуры:
3769
  * +0: dword: 5 = номер подфункции
3787
  * +0: dword: 5 = номер подфункции
3770
  * +4: dword: 0 (зарезервировано)
3788
  * +4: dword: 0 (зарезервировано)
3771
  * +8: dword: 0 (зарезервировано)
3789
  * +8: dword: 0 (зарезервировано)
3772
  * +12 = +0xC: dword: 0 (зарезервировано)
3790
  * +12 = +0xC: dword: 0 (зарезервировано)
3773
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
3791
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
3774
                        (40 байт)
3792
                        (40 байт)
3775
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3793
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3776
    общем описании
3794
    общем описании
3777
    или
3795
    или
3778
  * +20 = +0x14: db 0
3796
  * +20 = +0x14: db 0
3779
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3797
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3780
Возвращаемое значение:
3798
Возвращаемое значение:
3781
  * eax = 0 - успешно, иначе код ошибки файловой системы
3799
  * eax = 0 - успешно, иначе код ошибки файловой системы
3782
  * ebx разрушается
3800
  * ebx разрушается
3783
Информация о файле возвращается в формате БДВК
3801
Информация о файле возвращается в формате БДВК
3784
(блока данных входа каталога), указанном в описании
3802
(блока данных входа каталога), указанном в описании
3785
подфункции 1, но без имени файла
3803
подфункции 1, но без имени файла
3786
(то есть первые 40 = 0x28 байт).
3804
(то есть первые 40 = 0x28 байт).
3787
Замечания:
3805
Замечания:
3788
  * Функция не поддерживает виртуальные папки типа /, /rd и
3806
  * Функция не поддерживает виртуальные папки типа /, /rd и
3789
    корневые папки типа /rd/1.
3807
    корневые папки типа /rd/1.
3790
 
3808
 
3791
======================================================================
3809
======================================================================
3792
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
3810
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
3793
======================================================================
3811
======================================================================
3794
Параметры:
3812
Параметры:
3795
  * eax = 70 - номер функции
3813
  * eax = 70 - номер функции
3796
  * ebx = указатель на информационную структуру
3814
  * ebx = указатель на информационную структуру
3797
Формат информационной структуры:
3815
Формат информационной структуры:
3798
  * +0: dword: 6 = номер подфункции
3816
  * +0: dword: 6 = номер подфункции
3799
  * +4: dword: 0 (зарезервировано)
3817
  * +4: dword: 0 (зарезервировано)
3800
  * +8: dword: 0 (зарезервировано)
3818
  * +8: dword: 0 (зарезервировано)
3801
  * +12 = +0xC: dword: 0 (зарезервировано)
3819
  * +12 = +0xC: dword: 0 (зарезервировано)
3802
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
3820
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
3803
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3821
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3804
    общем описании
3822
    общем описании
3805
    или
3823
    или
3806
  * +20 = +0x14: db 0
3824
  * +20 = +0x14: db 0
3807
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3825
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3808
Возвращаемое значение:
3826
Возвращаемое значение:
3809
  * eax = 0 - успешно, иначе код ошибки файловой системы
3827
  * eax = 0 - успешно, иначе код ошибки файловой системы
3810
  * ebx разрушается
3828
  * ebx разрушается
3811
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
3829
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
3812
формат которого указан в описании подфункции 1
3830
формат которого указан в описании подфункции 1
3813
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
3831
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
3814
(биты 3,4 в dword'е +0) не меняется.
3832
(биты 3,4 в dword'е +0) не меняется.
3815
Байт +4 (формат имени) игнорируется.
3833
Байт +4 (формат имени) игнорируется.
3816
Замечания:
3834
Замечания:
3817
  * Функция не поддерживает виртуальные папки типа /, /rd и
3835
  * Функция не поддерживает виртуальные папки типа /, /rd и
3818
    корневые папки типа /rd/1.
3836
    корневые папки типа /rd/1.
3819
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3837
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3820
 
3838
 
3821
======================================================================
3839
======================================================================
3822
============ Функция 70, подфункция 7 - запуск программы. ============
3840
============ Функция 70, подфункция 7 - запуск программы. ============
3823
======================================================================
3841
======================================================================
3824
Параметры:
3842
Параметры:
3825
  * eax = 70 - номер функции
3843
  * eax = 70 - номер функции
3826
  * ebx = указатель на информационную структуру
3844
  * ebx = указатель на информационную структуру
3827
Формат информационной структуры:
3845
Формат информационной структуры:
3828
  * +0: dword: 7 = номер подфункции
3846
  * +0: dword: 7 = номер подфункции
3829
  * +4: dword: поле флагов:
3847
  * +4: dword: поле флагов:
3830
    * бит 0: запустить процесс как отлаживаемый
3848
    * бит 0: запустить процесс как отлаживаемый
3831
    * остальные биты зарезервированы и должны быть установлены в 0
3849
    * остальные биты зарезервированы и должны быть установлены в 0
3832
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
3850
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
3833
  * +12 = +0xC: dword: 0 (зарезервировано)
3851
  * +12 = +0xC: dword: 0 (зарезервировано)
3834
  * +16 = +0x10: dword: 0 (зарезервировано)
3852
  * +16 = +0x10: dword: 0 (зарезервировано)
3835
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3853
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3836
    общем описании
3854
    общем описании
3837
    или
3855
    или
3838
  * +20 = +0x14: db 0
3856
  * +20 = +0x14: db 0
3839
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3857
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3840
Возвращаемое значение:
3858
Возвращаемое значение:
3841
  * eax > 0 - программа загружена, eax содержит PID
3859
  * eax > 0 - программа загружена, eax содержит PID
3842
  * eax < 0 - произошла ошибка, -eax содержит
3860
  * eax < 0 - произошла ошибка, -eax содержит
3843
    код ошибки файловой системы
3861
    код ошибки файловой системы
3844
  * ebx разрушается
3862
  * ebx разрушается
3845
Замечания:
3863
Замечания:
3846
  * Командная строка должна заканчиваться символом с кодом 0
3864
  * Командная строка должна заканчиваться символом с кодом 0
3847
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
3865
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
3848
    включительно, либо первые 256 символов, в зависимости от того,
3866
    включительно, либо первые 256 символов, в зависимости от того,
3849
    что меньше.
3867
    что меньше.
3850
  * Если процесс запускается как отлаживаемый, он создаётся
3868
  * Если процесс запускается как отлаживаемый, он создаётся
3851
    в замороженном состоянии; для запуска используйте
3869
    в замороженном состоянии; для запуска используйте
3852
    подфункцию 5 функции 69.
3870
    подфункцию 5 функции 69.
3853
 
3871
 
3854
======================================================================
3872
======================================================================
3855
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
3873
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
3856
======================================================================
3874
======================================================================
3857
Параметры:
3875
Параметры:
3858
  * eax = 70 - номер функции
3876
  * eax = 70 - номер функции
3859
  * ebx = указатель на информационную структуру
3877
  * ebx = указатель на информационную структуру
3860
Формат информационной структуры:
3878
Формат информационной структуры:
3861
  * +0: dword: 8 = номер подфункции
3879
  * +0: dword: 8 = номер подфункции
3862
  * +4: dword: 0 (зарезервировано)
3880
  * +4: dword: 0 (зарезервировано)
3863
  * +8: dword: 0 (зарезервировано)
3881
  * +8: dword: 0 (зарезервировано)
3864
  * +12 = +0xC: dword: 0 (зарезервировано)
3882
  * +12 = +0xC: dword: 0 (зарезервировано)
3865
  * +16 = +0x10: dword: 0 (зарезервировано)
3883
  * +16 = +0x10: dword: 0 (зарезервировано)
3866
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3884
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3867
    общем описании
3885
    общем описании
3868
    или
3886
    или
3869
  * +20 = +0x14: db 0
3887
  * +20 = +0x14: db 0
3870
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3888
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3871
Возвращаемое значение:
3889
Возвращаемое значение:
3872
  * eax = 0 - успешно, иначе код ошибки файловой системы
3890
  * eax = 0 - успешно, иначе код ошибки файловой системы
3873
  * ebx разрушается
3891
  * ebx разрушается
3874
Замечания:
3892
Замечания:
3875
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3893
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3876
  * Можно удалять только пустые папки (попытка удаления непустой папки
3894
  * Можно удалять только пустые папки (попытка удаления непустой папки
3877
    приведёт к ошибке с кодом 10, "доступ запрещён").
3895
    приведёт к ошибке с кодом 10, "доступ запрещён").
3878
 
3896
 
3879
======================================================================
3897
======================================================================
3880
============= Функция 70, подфункция 9 - создание папки. =============
3898
============= Функция 70, подфункция 9 - создание папки. =============
3881
======================================================================
3899
======================================================================
3882
Параметры:
3900
Параметры:
3883
  * eax = 70 - номер функции
3901
  * eax = 70 - номер функции
3884
  * ebx = указатель на информационную структуру
3902
  * ebx = указатель на информационную структуру
3885
Формат информационной структуры:
3903
Формат информационной структуры:
3886
  * +0: dword: 9 = номер подфункции
3904
  * +0: dword: 9 = номер подфункции
3887
  * +4: dword: 0 (зарезервировано)
3905
  * +4: dword: 0 (зарезервировано)
3888
  * +8: dword: 0 (зарезервировано)
3906
  * +8: dword: 0 (зарезервировано)
3889
  * +12 = +0xC: dword: 0 (зарезервировано)
3907
  * +12 = +0xC: dword: 0 (зарезервировано)
3890
  * +16 = +0x10: dword: 0 (зарезервировано)
3908
  * +16 = +0x10: dword: 0 (зарезервировано)
3891
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
3909
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
3892
    общем описании
3910
    общем описании
3893
    или
3911
    или
3894
  * +20 = +0x14: db 0
3912
  * +20 = +0x14: db 0
3895
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки
3913
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки
3896
Возвращаемое значение:
3914
Возвращаемое значение:
3897
  * eax = 0 - успешно, иначе код ошибки файловой системы
3915
  * eax = 0 - успешно, иначе код ошибки файловой системы
3898
  * ebx разрушается
3916
  * ebx разрушается
3899
Замечания:
3917
Замечания:
3900
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3918
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3901
  * Родительская папка должна уже существовать.
3919
  * Родительская папка должна уже существовать.
3902
  * Если папка уже существует, функция завершится успешно (eax=0).
3920
  * Если папка уже существует, функция завершится успешно (eax=0).
3903
 
3921
 
3904
======================================================================
3922
======================================================================
3905
=== Функция 71, подфункция 1 - установить заголовок окна программы. ==
3923
=== Функция 71, подфункция 1 - установить заголовок окна программы. ==
3906
======================================================================
3924
======================================================================
3907
Параметры:
3925
Параметры:
3908
  * eax = 71 - номер функции
3926
  * eax = 71 - номер функции
3909
  * ebx = 1 - номер подфункции
3927
  * ebx = 1 - номер подфункции
3910
  * ecx = адрес строки заголовка
3928
  * ecx = адрес строки заголовка
3911
Возвращаемое значение:
3929
Возвращаемое значение:
3912
  * функция не возвращает значения
3930
  * функция не возвращает значения
3913
Замечания:
3931
Замечания:
3914
  * Строка заголовка должна быть в формате ASCIIZ. В заголовке
3932
  * Строка заголовка должна быть в формате ASCIIZ. В заголовке
3915
    отображается не более 255 символов независимо от полной длины
3933
    отображается не более 255 символов независимо от полной длины
3916
    строки.
3934
    строки.
3917
  * Чтобы убрать заголовок, передайте NULL в ecx.
3935
  * Чтобы убрать заголовок, передайте NULL в ecx.
3918
 
3936
 
3919
======================================================================
3937
======================================================================
3920
================ Функция 72 - послать сообщение окну. ================
3938
================ Функция 72 - послать сообщение окну. ================
3921
======================================================================
3939
======================================================================
3922
 
3940
 
3923
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
3941
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
3924
Параметры:
3942
Параметры:
3925
  * eax = 72 - номер функции
3943
  * eax = 72 - номер функции
3926
  * ebx = 1 - номер подфункции
3944
  * ebx = 1 - номер подфункции
3927
  * ecx = код события: 2 или 3
3945
  * ecx = код события: 2 или 3
3928
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
3946
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
3929
Возвращаемое значение:
3947
Возвращаемое значение:
3930
  * eax = 0 - успешно
3948
  * eax = 0 - успешно
3931
  * eax = 1 - буфер заполнен
3949
  * eax = 1 - буфер заполнен
3932
 
3950
 
3933
======================================================================
3951
======================================================================
3934
===================== Функция 73 - blit bitmap  =====================
3952
===================== Функция 73 - blit bitmap  =====================
3935
======================================================================
3953
======================================================================
3936
блит - копирование битового массив
3954
блит - копирование битового массив
3937
 
3955
 
3938
Параметры:
3956
Параметры:
3939
  * eax = 73 - номер функции
3957
  * eax = 73 - номер функции
3940
 
3958
 
3941
  * ebx = ROP и опциональные флаги
3959
  * ebx = ROP и опциональные флаги
3942
     31           6 5  4 3   0
3960
     31           6 5  4 3   0
3943
     [  reserved  ][T][B][ROP]
3961
     [  reserved  ][T][B][ROP]
3944
     ROP - код растровых операций
3962
     ROP - код растровых операций
3945
        0: копировать
3963
        0: копировать
3946
     1-15: Зарезервировано
3964
     1-15: Зарезервировано
3947
     B   - блит на фоновую поферхность
3965
     B   - блит на фоновую поферхность
3948
     T   - блит с прозрачностью
3966
     T   - блит с прозрачностью
3949
 
3967
 
3950
  * ecx = указатель на параметры функции
3968
  * ecx = указатель на параметры функции
3951
        смещение цели и отсечение
3969
        смещение цели и отсечение
3952
     +0 signed dword: смещение по X окна, для целевого прямоугольника
3970
     +0 signed dword: смещение по X окна, для целевого прямоугольника
3953
                      верхний левый угол
3971
                      верхний левый угол
3954
     +4 signed dword: смещение по Y окна, для целевого прямоугольника
3972
     +4 signed dword: смещение по Y окна, для целевого прямоугольника
3955
                      верхний левый угол
3973
                      верхний левый угол
3956
     +8 dword:        ширина целевого прямоугольника
3974
     +8 dword:        ширина целевого прямоугольника
3957
    +12 dword:        высота целевого прямоугольника
3975
    +12 dword:        высота целевого прямоугольника
3958
 
3976
 
3959
        смещение исходника и отсечение
3977
        смещение исходника и отсечение
3960
    +16 signed dword: смещение по X bitmap, для исходного прямоугольника
3978
    +16 signed dword: смещение по X bitmap, для исходного прямоугольника
3961
                      верхний левый угол
3979
                      верхний левый угол
3962
    +20 signed dword: смещение по Y bitmap, для исходного прямоугольника
3980
    +20 signed dword: смещение по Y bitmap, для исходного прямоугольника
3963
                      верхний левый угол
3981
                      верхний левый угол
3964
    +24 dword:        ширина исходного прямоугольника
3982
    +24 dword:        ширина исходного прямоугольника
3965
    +28 dword:        высота исходного прямоугольника
3983
    +28 dword:        высота исходного прямоугольника
3966
 
3984
 
3967
    +32: dword: данные bitmap - должны быть 32bpp
3985
    +32: dword: данные bitmap - должны быть 32bpp
3968
    +36: dword: размер строки bitmap в байтах
3986
    +36: dword: размер строки bitmap в байтах
3969
 
3987
 
3970
Возвращаемое значение:
3988
Возвращаемое значение:
3971
  * функция не возвращает значения
3989
  * функция не возвращает значения
3972
 
3990
 
3973
======================================================================
3991
======================================================================
3974
=================== Функция 74, подфункция -1 ========================
3992
=================== Функция 74, подфункция -1 ========================
3975
=========== Получить количество активных сетевых устройств. ==========
3993
=========== Получить количество активных сетевых устройств. ==========
3976
======================================================================
3994
======================================================================
3977
Параметры:
3995
Параметры:
3978
  * eax = 74 - номер функции
3996
  * eax = 74 - номер функции
3979
  * bl = -1 - номер подфункции
3997
  * bl = -1 - номер подфункции
3980
Возвращаемое значение:
3998
Возвращаемое значение:
3981
  * eax = количество активных сетевых устройств
3999
  * eax = количество активных сетевых устройств
3982
 
4000
 
3983
======================================================================
4001
======================================================================
3984
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
4002
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
3985
======================================================================
4003
======================================================================
3986
Параметры:
4004
Параметры:
3987
  * eax = 74 - номер функции
4005
  * eax = 74 - номер функции
3988
  * bl = 0 - номер подфункции
4006
  * bl = 0 - номер подфункции
3989
  * bh = номер устройства
4007
  * bh = номер устройства
3990
Возвращаемое значение:
4008
Возвращаемое значение:
3991
  * eax = тип устройства
4009
  * eax = тип устройства
3992
 
4010
 
3993
======================================================================
4011
======================================================================
3994
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
4012
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
3995
======================================================================
4013
======================================================================
3996
Параметры:
4014
Параметры:
3997
  * eax = 74 - номер функции
4015
  * eax = 74 - номер функции
3998
  * bl = 1 - номер подфункции
4016
  * bl = 1 - номер подфункции
3999
  * bh = номер устройства
4017
  * bh = номер устройства
4000
  * ecx = указатель на буфера - 64 байт 
4018
  * ecx = указатель на буфера - 64 байт 
4001
Возвращаемое значение:
4019
Возвращаемое значение:
4002
  * eax = -1 для ошибки
4020
  * eax = -1 для ошибки
4003
  * В случае успеха в буфер записывается имя сетевого устройства
4021
  * В случае успеха в буфер записывается имя сетевого устройства
4004
 
4022
 
4005
======================================================================
4023
======================================================================
4006
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
4024
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
4007
======================================================================
4025
======================================================================
4008
Параметры:
4026
Параметры:
4009
  * eax = 74 - номер функции
4027
  * eax = 74 - номер функции
4010
  * bl = 2 - номер подфункции
4028
  * bl = 2 - номер подфункции
4011
  * bh = номер устройства
4029
  * bh = номер устройства
4012
Возвращаемое значение:
4030
Возвращаемое значение:
4013
  * eax = -1 для ошибки
4031
  * eax = -1 для ошибки
4014
 
4032
 
4015
======================================================================
4033
======================================================================
4016
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
4034
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
4017
======================================================================
4035
======================================================================
4018
Параметры:
4036
Параметры:
4019
  * eax = 74 - номер функции
4037
  * eax = 74 - номер функции
4020
  * bl = 3 - номер подфункции
4038
  * bl = 3 - номер подфункции
4021
  * bh = номер устройства
4039
  * bh = номер устройства
4022
Возвращаемое значение:
4040
Возвращаемое значение:
4023
  * eax = -1 для ошибки
4041
  * eax = -1 для ошибки
4024
 
4042
 
4025
======================================================================
4043
======================================================================
4026
======= Функция 75, подфункция 0, Open socket (Открыть сокет). =======
4044
======= Функция 75, подфункция 0, Open socket (Открыть сокет). =======
4027
======================================================================
4045
======================================================================
4028
Параметры:
4046
Параметры:
4029
  * eax = 75 - номер функции
4047
  * eax = 75 - номер функции
4030
  * bl = 0 - номер подфункции
4048
  * bl = 0 - номер подфункции
4031
  * ecx = домен
4049
  * ecx = домен
4032
  * edx = тип
4050
  * edx = тип
4033
  * esi = протокол
4051
  * esi = протокол
4034
Возвращаемое значение:
4052
Возвращаемое значение:
4035
  * eax = номер сокета, -1 для ошибки
4053
  * eax = номер сокета, -1 для ошибки
4036
  * ebx = код ошибки
4054
  * ebx = код ошибки
4037
 
4055
 
4038
======================================================================
4056
======================================================================
4039
======= Функция 75, подфункция 1, Close socket (Закрыть сокет). ======
4057
======= Функция 75, подфункция 1, Close socket (Закрыть сокет). ======
4040
======================================================================
4058
======================================================================
4041
Параметры:
4059
Параметры:
4042
  * eax = 75 - номер функции
4060
  * eax = 75 - номер функции
4043
  * bl = 1 - номер подфункции
4061
  * bl = 1 - номер подфункции
4044
  * ecx = номер сокета
4062
  * ecx = номер сокета
4045
Возвращаемое значение:
4063
Возвращаемое значение:
4046
  * eax = -1 для ошибки
4064
  * eax = -1 для ошибки
4047
  * ebx = код ошибки
4065
  * ebx = код ошибки
4048
 
4066
 
4049
======================================================================
4067
======================================================================
4050
============= Функция 75, подфункция 2, Bind (Привязка). =============
4068
============= Функция 75, подфункция 2, Bind (Привязка). =============
4051
======================================================================
4069
======================================================================
4052
Параметры:
4070
Параметры:
4053
  * eax = 75 - номер функции
4071
  * eax = 75 - номер функции
4054
  * bl = 2 - номер подфункции
4072
  * bl = 2 - номер подфункции
4055
  * ecx = номер сокета
4073
  * ecx = номер сокета
4056
  * edx = указатель на структуру sockaddr
4074
  * edx = указатель на структуру sockaddr
4057
  * esi = длина структуры sockaddr
4075
  * esi = длина структуры sockaddr
4058
Возвращаемое значение:
4076
Возвращаемое значение:
4059
  * eax = -1 для ошибки
4077
  * eax = -1 для ошибки
4060
  * ebx = код ошибки
4078
  * ebx = код ошибки
4061
 
4079
 
4062
======================================================================
4080
======================================================================
4063
============ Функция 75, подфункция 3, Listen (Слушать). =============
4081
============ Функция 75, подфункция 3, Listen (Слушать). =============
4064
======================================================================
4082
======================================================================
4065
Параметры:
4083
Параметры:
4066
  * eax = 75 - номер функции
4084
  * eax = 75 - номер функции
4067
  * bl = 3 - номер подфункции
4085
  * bl = 3 - номер подфункции
4068
  * ecx = номер сокета
4086
  * ecx = номер сокета
4069
  * edx = backlog (возвращаемый лог)
4087
  * edx = backlog (возвращаемый лог)
4070
Возвращаемое значение:
4088
Возвращаемое значение:
4071
  * eax = -1 для ошибки
4089
  * eax = -1 для ошибки
4072
  * ebx = код ошибки
4090
  * ebx = код ошибки
4073
 
4091
 
4074
======================================================================
4092
======================================================================
4075
========== Функция 75, подфункция 4, Connect (Соединение). ===========
4093
========== Функция 75, подфункция 4, Connect (Соединение). ===========
4076
======================================================================
4094
======================================================================
4077
Параметры:
4095
Параметры:
4078
  * eax = 75 - номер функции
4096
  * eax = 75 - номер функции
4079
  * bl = 4 - номер подфункции
4097
  * bl = 4 - номер подфункции
4080
  * ecx = номер сокета
4098
  * ecx = номер сокета
4081
  * edx = указатель на структуру sockaddr
4099
  * edx = указатель на структуру sockaddr
4082
  * esi = длина структуры sockaddr
4100
  * esi = длина структуры sockaddr
4083
Возвращаемое значение:
4101
Возвращаемое значение:
4084
  * eax = -1 для ошибки
4102
  * eax = -1 для ошибки
4085
  * ebx = код ошибки
4103
  * ebx = код ошибки
4086
 
4104
 
4087
======================================================================
4105
======================================================================
4088
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
4106
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
4089
======================================================================
4107
======================================================================
4090
Параметры:
4108
Параметры:
4091
  * eax = 75 - номер функции
4109
  * eax = 75 - номер функции
4092
  * bl = 5 - номер подфункции
4110
  * bl = 5 - номер подфункции
4093
  * ecx = номер сокета
4111
  * ecx = номер сокета
4094
  * edx = указатель на структуру sockaddr
4112
  * edx = указатель на структуру sockaddr
4095
  * esi = длина структуры sockaddr
4113
  * esi = длина структуры sockaddr
4096
Возвращаемое значение:
4114
Возвращаемое значение:
4097
  * eax = номер сокета из принятого сокета, -1 для ошибки
4115
  * eax = номер сокета из принятого сокета, -1 для ошибки
4098
  * ebx = код ошибки
4116
  * ebx = код ошибки
4099
 
4117
 
4100
======================================================================
4118
======================================================================
4101
============= Функция 75, подфункция 6, Send (Послать). ==============
4119
============= Функция 75, подфункция 6, Send (Послать). ==============
4102
======================================================================
4120
======================================================================
4103
Параметры:
4121
Параметры:
4104
  * eax = 75 - номер функции
4122
  * eax = 75 - номер функции
4105
  * bl = 6 - номер подфункции
4123
  * bl = 6 - номер подфункции
4106
  * ecx = номер сокета
4124
  * ecx = номер сокета
4107
  * edx = указатель на буфер
4125
  * edx = указатель на буфер
4108
  * esi = длина буфера
4126
  * esi = длина буфера
4109
  * edi = флаги
4127
  * edi = флаги
4110
Возвращаемое значение:
4128
Возвращаемое значение:
4111
  * eax = количество скопированных байтов, -1 для ошибки
4129
  * eax = количество скопированных байтов, -1 для ошибки
4112
  * ebx = код ошибки
4130
  * ebx = код ошибки
4113
 
4131
 
4114
======================================================================
4132
======================================================================
4115
============ Функция 75, подфункция 7, Receive (Получить). ===========
4133
============ Функция 75, подфункция 7, Receive (Получить). ===========
4116
======================================================================
4134
======================================================================
4117
Параметры:
4135
Параметры:
4118
  * eax = 75 - номер функции
4136
  * eax = 75 - номер функции
4119
  * bl = 7 - номер подфункции
4137
  * bl = 7 - номер подфункции
4120
  * ecx = номер сокета
4138
  * ecx = номер сокета
4121
  * edx = указатель на буфер
4139
  * edx = указатель на буфер
4122
  * esi = длина буфера
4140
  * esi = длина буфера
4123
  * edi = флаги
4141
  * edi = флаги
4124
Возвращаемое значение:
4142
Возвращаемое значение:
4125
  * eax = количество скопированных байтов, -1 для ошибки
4143
  * eax = количество скопированных байтов, -1 для ошибки
4126
  * ebx = код ошибки
4144
  * ebx = код ошибки
4127
 
4145
 
4128
======================================================================
4146
======================================================================
4129
= Функция 75, подфункция 8, Set socket options (Задать опции сокета) = 
4147
= Функция 75, подфункция 8, Set socket options (Задать опции сокета) = 
4130
======================================================================
4148
======================================================================
4131
Параметры:
4149
Параметры:
4132
  * eax = 75 - номер функции
4150
  * eax = 75 - номер функции
4133
  * bl = 8 - номер подфункции
4151
  * bl = 8 - номер подфункции
4134
  * ecx = номер сокета
4152
  * ecx = номер сокета
4135
  * edx = указатель на optstruct
4153
  * edx = указатель на optstruct
4136
Возвращаемое значение:
4154
Возвращаемое значение:
4137
  * eax = -1 для ошибки
4155
  * eax = -1 для ошибки
4138
  * ebx = код ошибки
4156
  * ebx = код ошибки
4139
Замечания:
4157
Замечания:
4140
 
4158
 
4141
  Optstruct: dd level
4159
  Optstruct: dd level
4142
             dd optionname
4160
             dd optionname
4143
             dd optlength
4161
             dd optlength
4144
             db options...
4162
             db options...
4145
 
4163
 
4146
======================================================================
4164
======================================================================
4147
= Функция 75, подфункция 9, Get socket options(Получить опции сокета) 
4165
= Функция 75, подфункция 9, Get socket options(Получить опции сокета) 
4148
======================================================================
4166
======================================================================
4149
Параметры:
4167
Параметры:
4150
  * eax = 75 - номер функции
4168
  * eax = 75 - номер функции
4151
  * bl = 9 - номер подфункции
4169
  * bl = 9 - номер подфункции
4152
  * ecx = номер сокета
4170
  * ecx = номер сокета
4153
  * edx = указатель на optstruct
4171
  * edx = указатель на optstruct
4154
Возвращаемое значение:
4172
Возвращаемое значение:
4155
  * eax = -1 для ошибки
4173
  * eax = -1 для ошибки
4156
  * ebx = код ошибки
4174
  * ebx = код ошибки
4157
Замечания:
4175
Замечания:
4158
 
4176
 
4159
  Optstruct: dd level
4177
  Optstruct: dd level
4160
             dd optionname
4178
             dd optionname
4161
             dd optlength
4179
             dd optlength
4162
             db options...
4180
             db options...
4163
 
4181
 
4164
======================================================================
4182
======================================================================
4165
= Функция 75, подфункция 10, Get socketpair (Получить парный сокет). =
4183
= Функция 75, подфункция 10, Get socketpair (Получить парный сокет). =
4166
======================================================================
4184
======================================================================
4167
Параметры:
4185
Параметры:
4168
  * eax = 75 - номер функции
4186
  * eax = 75 - номер функции
4169
  * bl = 10 - номер подфункции
4187
  * bl = 10 - номер подфункции
4170
Возвращаемое значение:
4188
Возвращаемое значение:
4171
  * eax = socketnum1, -1 для ошибки
4189
  * eax = socketnum1, -1 для ошибки
4172
  * ebx = socketnum2, код ошибки в случае ошибки
4190
  * ebx = socketnum2, код ошибки в случае ошибки
4173
 
4191
 
4174
======================================================================
4192
======================================================================
4175
========== Функция -1 - завершить выполнение потока/процесса =========
4193
========== Функция -1 - завершить выполнение потока/процесса =========
4176
======================================================================
4194
======================================================================
4177
Параметры:
4195
Параметры:
4178
  * eax = -1 - номер функции
4196
  * eax = -1 - номер функции
4179
Возвращаемое значение:
4197
Возвращаемое значение:
4180
  * функция не возвращает ни значения, ни управления
4198
  * функция не возвращает ни значения, ни управления
4181
Замечания:
4199
Замечания:
4182
  * Если процесс явно не создавал потоков, то у него есть только
4200
  * Если процесс явно не создавал потоков, то у него есть только
4183
    один поток, завершение которого приводит к завершению процесса.
4201
    один поток, завершение которого приводит к завершению процесса.
4184
  * Если текущий поток - последний в процессе, то его завершение
4202
  * Если текущий поток - последний в процессе, то его завершение
4185
    также приводит к завершению процесса.
4203
    также приводит к завершению процесса.
4186
  * Эта функция завершает текущий поток. Другой поток можно прибить
4204
  * Эта функция завершает текущий поток. Другой поток можно прибить
4187
    вызовом подфункции 2 функции 18.
4205
    вызовом подфункции 2 функции 18.
4188
 
4206
 
4189
======================================================================
4207
======================================================================
4190
=========================== Список событий ===========================
4208
=========================== Список событий ===========================
4191
======================================================================
4209
======================================================================
4192
Очередное событие можно получить вызовом одной из функций 10
4210
Очередное событие можно получить вызовом одной из функций 10
4193
(ожидать события), 11 (проверить без ожидания), 23
4211
(ожидать события), 11 (проверить без ожидания), 23
4194
(ожидать в течение заданного времени).
4212
(ожидать в течение заданного времени).
4195
Эти функции возвращают только те события, которые входят в маску,
4213
Эти функции возвращают только те события, которые входят в маску,
4196
устанавливаемую функцией 40. По умолчанию это первые три, чего
4214
устанавливаемую функцией 40. По умолчанию это первые три, чего
4197
вполне достаточно для многих приложений.
4215
вполне достаточно для многих приложений.
4198
Коды событий:
4216
Коды событий:
4199
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
4217
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
4200
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
4218
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
4201
    активно) или нажата "горячая клавиша";
4219
    активно) или нажата "горячая клавиша";
4202
    сбрасывается, когда все клавиши из буфера считаны функцией 2
4220
    сбрасывается, когда все клавиши из буфера считаны функцией 2
4203
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
4221
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
4204
    закрытия, созданная неявно функцией 0; кнопка минимизации
4222
    закрытия, созданная неявно функцией 0; кнопка минимизации
4205
    обрабатывается системой и о ней сообщения не приходит;
4223
    обрабатывается системой и о ней сообщения не приходит;
4206
    поступает, только когда окно активно; сбрасывается, когда все
4224
    поступает, только когда окно активно; сбрасывается, когда все
4207
    кнопки из буфера считаны функцией 17)
4225
    кнопки из буфера считаны функцией 17)
4208
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
4226
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
4209
    при размаскировке функцией 40)
4227
    при размаскировке функцией 40)
4210
  * 5 = завершилась перерисовка фона рабочего стола
4228
  * 5 = завершилась перерисовка фона рабочего стола
4211
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
4229
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
4212
    или перемещение; сбрасывается при прочтении)
4230
    или перемещение; сбрасывается при прочтении)
4213
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
4231
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
4214
    Communication; сбрасывается при прочтении)
4232
    Communication; сбрасывается при прочтении)
4215
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
4233
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
4216
    смотри работу с сетью)
4234
    смотри работу с сетью)
4217
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
4235
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
4218
    смотри отладочную подсистему)
4236
    смотри отладочную подсистему)
4219
  * 16..31 = произошло событие с соответствующим IRQ
4237
  * 16..31 = произошло событие с соответствующим IRQ
4220
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
4238
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
4221
 
4239
 
4222
======================================================================
4240
======================================================================
4223
==================== Коды ошибок файловой системы ====================
4241
==================== Коды ошибок файловой системы ====================
4224
======================================================================
4242
======================================================================
4225
  * 0 = успешно
4243
  * 0 = успешно
4226
  * 1 = не определена база и/или раздел жёсткого диска (подфункциями
4244
  * 1 = не определена база и/или раздел жёсткого диска (подфункциями
4227
    7, 8 функции 21)
4245
    7, 8 функции 21)
4228
  * 2 = функция не поддерживается для данной файловой системы
4246
  * 2 = функция не поддерживается для данной файловой системы
4229
  * 3 = неизвестная файловая система
4247
  * 3 = неизвестная файловая система
4230
  * 4 = зарезервировано, никогда не возвращается в текущей реализации
4248
  * 4 = зарезервировано, никогда не возвращается в текущей реализации
4231
  * 5 = файл не найден
4249
  * 5 = файл не найден
4232
  * 6 = файл закончился
4250
  * 6 = файл закончился
4233
  * 7 = указатель вне памяти приложения
4251
  * 7 = указатель вне памяти приложения
4234
  * 8 = диск заполнен
4252
  * 8 = диск заполнен
4235
  * 9 = таблица FAT разрушена
4253
  * 9 = таблица FAT разрушена
4236
  * 10 = доступ запрещён
4254
  * 10 = доступ запрещён
4237
  * 11 = ошибка устройства
4255
  * 11 = ошибка устройства
4238
При запуске программы возможны также следующие коды ошибок:
4256
При запуске программы возможны также следующие коды ошибок:
4239
  * 30 = 0x1E = недостаточно памяти
4257
  * 30 = 0x1E = недостаточно памяти
4240
  * 31 = 0x1F = файл не является исполнимым
4258
  * 31 = 0x1F = файл не является исполнимым
4241
  * 32 = 0x20 = слишком много процессов
4259
  * 32 = 0x20 = слишком много процессов
4242
>
4260
>
4243
>
4261
>