forked from KolibriOS/kolibrios
2b4eae90f6
git-svn-id: svn://kolibrios.org@7920 a494cfbc-eb01-0410-851d-a64ba20cac60
91 lines
4.3 KiB
C
91 lines
4.3 KiB
C
#ifndef INCLUDE_IPC_H
|
||
#define INCLUDE_IPC_H
|
||
|
||
/*
|
||
|
||
======================================================================
|
||
=========== Функция 60 - Inter Process Communication (IPC). ==========
|
||
======================================================================
|
||
IPC применяется для посылок сообщений от одного процесса/потока
|
||
другому. При этом следует предварительно договориться о том, как
|
||
интерпретировать конкретное сообщение.
|
||
|
||
-------- Подфункция 1 - установить область для получения IPC ---------
|
||
Вызывается процессом-приёмником.
|
||
Параметры:
|
||
* eax = 60 - номер функции
|
||
* ebx = 1 - номер подфункции
|
||
* ecx = указатель на буфер
|
||
* edx = размер буфера
|
||
Возвращаемое значение:
|
||
* eax = 0 - всегда успешно
|
||
Формат IPC-буфера:
|
||
* +0: dword: если здесь не 0, то буфер считается заблокированным;
|
||
блокируйте/разблокируйте буфер, когда вы с ним активно работаете
|
||
и вам надо, чтобы извне не изменялись данные буфера
|
||
(не поступали новые сообщения)
|
||
* +4: dword: занято места в буфере (в байтах)
|
||
* +8: первое сообщение
|
||
* +8+n: второе сообщение
|
||
* ...
|
||
Формат сообщения:
|
||
* +0: dword: PID процесса/потока, пославшего сообщение
|
||
* +4: dword: длина сообщения (не считая этот заголовок)
|
||
* +8: n*byte: данные сообщения
|
||
|
||
--------------- Подфункция 2 - послать сообщение IPC. ----------------
|
||
Вызывается процессом-инициатором.
|
||
Параметры:
|
||
* eax = 60 - номер функции
|
||
* ebx = 2 - номер подфункции
|
||
* ecx = PID приёмника
|
||
* edx = указатель на данные сообщения
|
||
* esi = длина сообщения (в байтах)
|
||
Возвращаемое значение:
|
||
* eax = 0 - успешно
|
||
* eax = 1 - приёмник не определил буфер для IPC-сообщений
|
||
(может быть, ещё не успел, а может быть, это не тот поток,
|
||
который нужен)
|
||
* eax = 2 - приёмник заблокировал IPC-буфер;
|
||
попробуйте немного подождать
|
||
* eax = 3 - переполнение IPC-буфера приёмника
|
||
* eax = 4 - процесса/потока с таким PID не существует
|
||
Замечания:
|
||
* Система сразу после записи IPC-сообщения в буфер посылает
|
||
потоку-приёмнику событие с кодом 7 (см. коды событий).
|
||
|
||
---------------------- Константы для регистров: ----------------------
|
||
eax - SF_IPC (60)
|
||
ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
|
||
|
||
*/
|
||
|
||
inline fastcall void IpcSetArea(ECX, EDX)
|
||
{
|
||
$mov eax, 60
|
||
$mov ebx, 1
|
||
// ecx = указатель на буфер
|
||
// edx = размер буфера
|
||
$int 64
|
||
// eax = 0 - всегда успешно
|
||
}
|
||
|
||
inline fastcall int SendIpcMessage(ECX, EDX, ESI)
|
||
{
|
||
$mov eax, 60
|
||
$mov ebx, 2
|
||
// ecx = PID приёмника
|
||
// edx = указатель на данные сообщения
|
||
// esi = длина сообщения (в байтах)
|
||
$int 64
|
||
// eax = 0 - успешно
|
||
// eax = 1 - приёмник не определил буфер для IPC-сообщений
|
||
// (может быть, ещё не успел, а может быть, это
|
||
// не тот поток, который нужен)
|
||
// eax = 2 - приёмник заблокировал IPC-буфер;
|
||
// попробуйте немного подождать
|
||
// eax = 3 - переполнение IPC-буфера приёмника
|
||
// eax = 4 - процесса/потока с таким PID не существует
|
||
}
|
||
|
||
#endif |