Subversion Repositories Kolibri OS

Rev

Rev 7773 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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. {
  65.         $mov eax, 60
  66.         $mov ebx, 1
  67.         // ecx = указатель на буфер
  68.         // edx = размер буфера
  69.         $int 64
  70.         // eax = 0 - всегда успешно
  71. }
  72.  
  73. inline fastcall int SendIpcMessage(ECX, EDX, ESI)
  74. {
  75.         $mov eax, 60
  76.         $mov ebx, 2
  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