Rev 7773 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7773 | leency | 1 | #ifndef INCLUDE_IPC_H |
2 | #define INCLUDE_IPC_H |
||
3 | |||
4 | /* |
||
5 | |||
6 | ====================================================================== |
||
7 | =========== Функция 60 - Inter Process Communication (IPC). ========== |
||
8 | ====================================================================== |
||
9 | IPC применяется для посылок сообщений от одного процесса/потока |
||
10 | другому. При этом следует предварительно договориться о том, как |
||
11 | интерпретировать конкретное сообщение. |
||
12 | |||
13 | -------- Подфункция 1 - установить область для получения IPC --------- |
||
14 | Вызывается процессом-приёмником. |
||
15 | Параметры: |
||
16 | * eax = 60 - номер функции |
||
17 | * ebx = 1 - номер подфункции |
||
18 | * ecx = указатель на буфер |
||
19 | * edx = размер буфера |
||
20 | Возвращаемое значение: |
||
21 | * eax = 0 - всегда успешно |
||
22 | Формат IPC-буфера: |
||
23 | * +0: dword: если здесь не 0, то буфер считается заблокированным; |
||
24 | блокируйте/разблокируйте буфер, когда вы с ним активно работаете |
||
25 | и вам надо, чтобы извне не изменялись данные буфера |
||
26 | (не поступали новые сообщения) |
||
27 | * +4: dword: занято места в буфере (в байтах) |
||
28 | * +8: первое сообщение |
||
29 | * +8+n: второе сообщение |
||
30 | * ... |
||
31 | Формат сообщения: |
||
32 | * +0: dword: PID процесса/потока, пославшего сообщение |
||
33 | * +4: dword: длина сообщения (не считая этот заголовок) |
||
34 | * +8: n*byte: данные сообщения |
||
35 | |||
36 | --------------- Подфункция 2 - послать сообщение IPC. ---------------- |
||
37 | Вызывается процессом-инициатором. |
||
38 | Параметры: |
||
39 | * eax = 60 - номер функции |
||
40 | * ebx = 2 - номер подфункции |
||
41 | * ecx = PID приёмника |
||
42 | * edx = указатель на данные сообщения |
||
43 | * esi = длина сообщения (в байтах) |
||
44 | Возвращаемое значение: |
||
45 | * eax = 0 - успешно |
||
46 | * eax = 1 - приёмник не определил буфер для IPC-сообщений |
||
47 | (может быть, ещё не успел, а может быть, это не тот поток, |
||
48 | который нужен) |
||
49 | * eax = 2 - приёмник заблокировал IPC-буфер; |
||
50 | попробуйте немного подождать |
||
51 | * eax = 3 - переполнение IPC-буфера приёмника |
||
52 | * eax = 4 - процесса/потока с таким PID не существует |
||
53 | Замечания: |
||
54 | * Система сразу после записи IPC-сообщения в буфер посылает |
||
55 | потоку-приёмнику событие с кодом 7 (см. коды событий). |
||
56 | |||
57 | ---------------------- Константы для регистров: ---------------------- |
||
58 | eax - SF_IPC (60) |
||
59 | ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2) |
||
60 | |||
61 | */ |
||
62 | |||
63 | inline fastcall void IpcSetArea(ECX, EDX) |
||
64 | { |
||
7920 | leency | 65 | $mov eax, 60 |
66 | $mov ebx, 1 |
||
7773 | leency | 67 | // ecx = указатель на буфер |
68 | // edx = размер буфера |
||
69 | $int 64 |
||
70 | // eax = 0 - всегда успешно |
||
71 | } |
||
72 | |||
73 | inline fastcall int SendIpcMessage(ECX, EDX, ESI) |
||
74 | { |
||
7920 | leency | 75 | $mov eax, 60 |
76 | $mov ebx, 2 |
||
7773 | leency | 77 | // ecx = PID приёмника |
78 | // edx = указатель на данные сообщения |
||
79 | // esi = длина сообщения (в байтах) |
||
80 | $int 64 |
||
81 | // eax = 0 - успешно |
||
82 | // eax = 1 - приёмник не определил буфер для IPC-сообщений |
||
83 | // (может быть, ещё не успел, а может быть, это |
||
84 | // не тот поток, который нужен) |
||
85 | // eax = 2 - приёмник заблокировал IPC-буфер; |
||
86 | // попробуйте немного подождать |
||
87 | // eax = 3 - переполнение IPC-буфера приёмника |
||
88 | // eax = 4 - процесса/потока с таким PID не существует |
||
89 | } |
||
90 | |||
91 | #endif |