#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