#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