forked from KolibriOS/kolibrios
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)
|
|||
|
{
|
|||
|
$eax, 60
|
|||
|
$ebx, 1
|
|||
|
// ecx = указатель на буфер
|
|||
|
// edx = размер буфера
|
|||
|
$int 64
|
|||
|
// eax = 0 - всегда успешно
|
|||
|
}
|
|||
|
|
|||
|
inline fastcall int SendIpcMessage(ECX, EDX, ESI)
|
|||
|
{
|
|||
|
$eax, 60
|
|||
|
$ebx, 2
|
|||
|
// ecx = PID приёмника
|
|||
|
// edx = указатель на данные сообщения
|
|||
|
// esi = длина сообщения (в байтах)
|
|||
|
$int 64
|
|||
|
// eax = 0 - успешно
|
|||
|
// eax = 1 - приёмник не определил буфер для IPC-сообщений
|
|||
|
// (может быть, ещё не успел, а может быть, это
|
|||
|
// не тот поток, который нужен)
|
|||
|
// eax = 2 - приёмник заблокировал IPC-буфер;
|
|||
|
// попробуйте немного подождать
|
|||
|
// eax = 3 - переполнение IPC-буфера приёмника
|
|||
|
// eax = 4 - процесса/потока с таким PID не существует
|
|||
|
}
|
|||
|
|
|||
|
#endif
|