Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Копаем клиент (http://mangos.ytdb.ru/forumdisplay.php?f=35)
-   -   Откуда вызываются обработчики (http://mangos.ytdb.ru/showthread.php?t=5005)

HuntsMan 22.08.2011 19:12

Откуда вызываются формировщики
 
Разбирал один пакет, Client->Server направленности, хотел пошариться по месту где вызывается функция формирующая пакет, и тут столкнулся с проблемой: поиск по декомпилированному листингу ничего не дал кроме объявления и заполнения этой функции. Получается, что она тоже вызывается по хеш таблице, или как это там правильно называется, а вот как найти эту таблицу никто не в курсе?

Клиент 4.0.6а.

Chameleon 22.08.2011 22:08

CMSG отправляющие функции должны вызываться прямым образом. Попробуй использовать xref в иде вместо поиска по декомпилу. Точнее сказать не могу, не зная про какой пакет речь.

HuntsMan 23.08.2011 09:47

Смотре в иде, она вроде как в дереве указывает откуда функция вызывается, но для моей ничего подобного не увидел. Опкод CMSG_GUILD_ADD_RANK.

Chameleon 23.08.2011 12:16

Не напрямую, но как я и говорил по xref находится.
Для билда 14333: CMSG_GUILD_ADD_RANK, номер 33888, хэндлер 6B96E0.
По xref находится только
Код:

.rdata:00B8F498 off_B8F498      dd offset sub_6B96E0
Смотришь xref к off_B8F498 и там 3 функции: что-то типа конструктора, деструктора и еще чего-то. По 2м из них через xref находится вызывающая функция sub_91B660 - обработчик LUA GuildControlAddRank.

HuntsMan 23.08.2011 16:23

Спасибо, добрался я до нужного места :)
Теперь другой вопрос :) смотря на функцию int __thiscall sub_969F70(void *this, int a2) я как понял в первом аргументе идет адрес, дальше к примеру к этому адресу прибавляется 57 (CDataStore__PutInt8(a2, *((_BYTE *)v3 + 57));) ну и т.п. А теперь вопрос: от какого адреса нужно плясать? Я так понял нужно от адреса вызова функции sub_4ED020:
Код:

  if ( FrameScript__IsString(a1, 1) )
  {
    if ( (unsigned int)dword_DFAF78 < 0xA )
    {
      v3 = FrameScript__ToLString(a1, 1, 0);
      if ( v3 )
      {
        if ( *(_BYTE *)v3 )
        {
          sub_4ED020(v3, (unsigned int)&v6, 16, 64, 1);
          v4 = ClntObjMgrGetActivePlayerObj();
          if ( v4 )
          {
            sub_969F30((int)&v5, **((_DWORD **)v4 + 2), *(_DWORD *)(*((_DWORD *)v4 + 2) + 4), (int)&v6, dword_DFAF78);
            ClientConnection__SendSpecialPacket((int)&v5);
            sub_9699A0(&v5);
          }
        }
      }
    }
    result = 0;
  }



Текущее время: 03:28. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS