Формат clients.bin - kryukov/jimm-multi GitHub Wiki

Table of Contents

Обозначения

int - 4х байтовое число в LE формате (число 0х1234 в памяти выглядит как 0х12 0х34)
word - 2х байтовое число
utf8 - 2х байтовая длина строки и сама строка в кодировке utf8
byte - 1 байт
cap - (byte длины капса, word смещение в сегменте гуидов)

Общая структура файла

[Секция кода]
[Секция гуидов]
[Секция FP]
[Список клиентов]
[Секция маскировок]

Секция кода

[int-длина]
[Определения клиентов]

Каждое определение начинается с байта длины.

Флаги

За ним идет байт с флагами, которые характеризуют данные, которые записаны после байта.

  • 7 - protocol (protocol(2b))
  • 0 - caps count (capsCount(1b))
  • 1 - fp0 (fpIndex(1b))
  • 2 - fp1 (fpIndex(1b))
  • 3 - fp2 (fpIndex(1b))
  • 4 - caps (count(1b) (length(1b) where(2b))+)
  • 5 - !caps (count(1b) (length(1b) where(2b))+)
  • 6 - Version (type(1b=0) ...

Данные, характеризующие клиент

Друг за другом, в зависимости от включённых флагов, пишутся следующие данные:

  • Если задан бит 7 следующий word c версией
  • Если задан бит 0 следующий byte количеством капсов
  • Если задан бит 1 следующий byte индекс fp #0
  • Если задан бит 2 следующий byte индекс fp #1
  • Если задан бит 3 следующий byte индекс fp #2
  • Если задан бит 4 далее byte с числом капсов и список cap
  • Если задан бит 5 далее byte с числом не содержащихся капсов и список cap
  • Если задан бит 6 далее byte с типом и зависящий от типа формат версии.
Далее идёт byte с номером в списке клиентов

Форматы версий

0 - GUID string (cap) (offset length)(1b))
1 - GUID bytes (cap) (offset length)(1b))
2 - GUID Miranda (cap) (offset=0 length=0)) - для Миранды Jimm сам извлекает информацию о версии
3 - FP bytes (fpIndex(1b))
4 - FP string (fpIndex(1b))
5 - FP int (fpIndex(1b))

  • (offset length) - упакованные в byte смещение и длина строки с версией (0xF0 - смещение и 0x0F - длина).

Секция гуидов

[int-длина]
[byte-данные]

Секция гуидов предназначена для записи так называемых GUIDs (или CAPs в QIP Infium). Поскольку в секции кода они идентифицируются по положению и длине, то капсы могут налезать друг на друга в случае частичного совпадения.

Секция FP

[byte-количество]
[int-FPs]

Секция FP служит для записи так называемых FPs (или DCInfo в QIP Infium).

Список клиентов

[byte-количество]
[utf8-строки]
[byte-номера иконок]

Этот список служит для записи названий клиентов и номера соответствующей иконки.

Секция маскировок

[byte-номер маскировки по умолчанию]
[byte-число маскировок]
[данные с маскировками]

Данные с маскировками:

[byte-длина данных с маскировкой]
[word-версия протокола]
[3xbyte-индексы FPs]
[друг за другом word-позиции GUIDs]

⚠️ **GitHub.com Fallback** ⚠️