0,0 → 1,91 |
#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 |