kolibrios/programs/cmm/lib/ipc.h

91 lines
4.3 KiB
C
Raw Permalink Normal View History

#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