Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7773 leency 1
#ifndef INCLUDE_IPC_H
2
#define INCLUDE_IPC_H
3
 
4
/*
5
 
6
======================================================================
7
=========== Функция 60 - Inter Process Communication (IPC). ==========
8
======================================================================
9
IPC применяется для посылок сообщений от одного процесса/потока
10
другому. При этом следует предварительно договориться о том, как
11
интерпретировать конкретное сообщение.
12
 
13
-------- Подфункция 1 - установить область для получения IPC ---------
14
Вызывается процессом-приёмником.
15
Параметры:
16
  * eax = 60 - номер функции
17
  * ebx = 1 - номер подфункции
18
  * ecx = указатель на буфер
19
  * edx = размер буфера
20
Возвращаемое значение:
21
  * eax = 0 - всегда успешно
22
Формат IPC-буфера:
23
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
24
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
25
    и вам надо, чтобы извне не изменялись данные буфера
26
    (не поступали новые сообщения)
27
  * +4: dword: занято места в буфере (в байтах)
28
  * +8: первое сообщение
29
  * +8+n: второе сообщение
30
  * ...
31
Формат сообщения:
32
  * +0: dword: PID процесса/потока, пославшего сообщение
33
  * +4: dword: длина сообщения (не считая этот заголовок)
34
  * +8: n*byte: данные сообщения
35
 
36
--------------- Подфункция 2 - послать сообщение IPC. ----------------
37
Вызывается процессом-инициатором.
38
Параметры:
39
  * eax = 60 - номер функции
40
  * ebx = 2 - номер подфункции
41
  * ecx = PID приёмника
42
  * edx = указатель на данные сообщения
43
  * esi = длина сообщения (в байтах)
44
Возвращаемое значение:
45
  * eax = 0 - успешно
46
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
47
    (может быть, ещё не успел, а может быть, это не тот поток,
48
    который нужен)
49
  * eax = 2 - приёмник заблокировал IPC-буфер;
50
    попробуйте немного подождать
51
  * eax = 3 - переполнение IPC-буфера приёмника
52
  * eax = 4 - процесса/потока с таким PID не существует
53
Замечания:
54
  * Система сразу после записи IPC-сообщения в буфер посылает
55
    потоку-приёмнику событие с кодом 7 (см. коды событий).
56
 
57
---------------------- Константы для регистров: ----------------------
58
  eax - SF_IPC (60)
59
  ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
60
 
61
  */
62
 
63
inline fastcall void IpcSetArea(ECX, EDX)
64
{
7920 leency 65
	$mov eax, 60
66
	$mov ebx, 1
7773 leency 67
	// ecx = указатель на буфер
68
	// edx = размер буфера
69
	$int 64
70
	// eax = 0 - всегда успешно
71
}
72
 
73
inline fastcall int SendIpcMessage(ECX, EDX, ESI)
74
{
7920 leency 75
	$mov eax, 60
76
	$mov ebx, 2
7773 leency 77
	// ecx = PID приёмника
78
	// edx = указатель на данные сообщения
79
	// esi = длина сообщения (в байтах)
80
	$int 64
81
	// eax = 0 - успешно
82
	// eax = 1 - приёмник не определил буфер для IPC-сообщений
83
	//           (может быть, ещё не успел, а может быть, это
84
	//           не тот поток, который нужен)
85
	// eax = 2 - приёмник заблокировал IPC-буфер;
86
	//           попробуйте немного подождать
87
	// eax = 3 - переполнение IPC-буфера приёмника
88
	// eax = 4 - процесса/потока с таким PID не существует
89
}
90
 
91
#endif