kolibrios/programs/cmm/lib/ipc.h
Kirill Lipatov (Leency) 2b4eae90f6 cmm: various fixes
git-svn-id: svn://kolibrios.org@7920 a494cfbc-eb01-0410-851d-a64ba20cac60
2020-05-15 08:09:03 +00:00

91 lines
4.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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