Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент > Копаем клиент

Важная информация

Копаем клиент Копаем клиент

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.03.2013, 12:58   #1
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию wdb string 5.2.0 Build 16650

С выходом патча 5.2 в кеше появилсь новые типы строк.
В первых 2х байтах содержится длина строки (но не в чистом виде).

для получения длины строки клиент использует 2 функции:
Код:
unsigned int __thiscall CDataStore::GetStrLen(int this, int a2)
{
    int v2; // edi@1
    char v3; // cl@1
    int v4; // ecx@2
    unsigned int v5; // eax@2
    unsigned int v6; // esi@3
    int v7; // ecx@3
    int v9; // [sp+Ah] [bp-6h]@0
    unsigned __int8 v10; // [sp+Eh] [bp-2h]@3
    unsigned __int8 v11; // [sp+Fh] [bp-1h]@2

    v2 = this;
    v3 = *(_BYTE *)(this + 5);
    if ( v3 == 8 )
    {
        v4 = *(_DWORD *)v2;
        v11 = 0;
        CDataStore::GetInt8(v4, (int)&v11);
        v5 = v11;
    }
    else
    {
        v6 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
        v7 = *(_DWORD *)v2;
        v10 = 0;
        CDataStore::GetInt8(v7, (int)&v10);
        v5 = (v6 << *(_BYTE *)(v2 + 5)) | ((unsigned int)v10 >> (8 - *(_BYTE *)(v2 + 5)));
        *(_BYTE *)(v2 + 4) = v10 << *(_BYTE *)(v2 + 5);
    }
    LOBYTE(v9) = 0;
    return 16 * v5 | CDataStore::GetLoByte(v2, v9);
}

unsigned int __thiscall CDataStore::GetLoByte(int this, int a2)
{
    int v2; // esi@1
    unsigned __int8 v3; // cl@1
    unsigned __int8 v4; // dl@2
    unsigned int result; // eax@2
    unsigned int v6; // edi@5
    unsigned __int8 v7; // bl@5
    char v8; // dl@5
    unsigned int v9; // eax@5
    char v10; // cl@5
    unsigned __int8 v11; // [sp+7h] [bp-1h]@3

    v2 = this;
    v3 = *(_BYTE *)(this + 5);
    if ( v3 > 4u )
    {
        v11 = 0;
        if ( v3 == 8 )
        {
            CDataStore::GetInt8(*(_DWORD *)v2, (int)&v11);
            result = (unsigned int)v11 >> 4;
            *(_BYTE *)(v2 + 4) = 16 * v11;
            *(_BYTE *)(v2 + 5) = 4;
        }
        else
        {
            v6 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
            CDataStore::GetInt8(*(_DWORD *)v2, (int)&v11);
            v7 = v11;
            v8 = *(_BYTE *)(v2 + 5) - 4;
            v9 = (unsigned int)v11 >> (8 - v8);
            v10 = *(_BYTE *)(v2 + 5) - 4;
            *(_BYTE *)(v2 + 5) = v8;
            result = (v6 << v10) | v9;
            *(_BYTE *)(v2 + 4) = v7 << v10;
        }
    }
    else
    {
        v4 = *(_BYTE *)(v2 + 4);
        result = (unsigned int)v4 >> 4;
        *(_BYTE *)(v2 + 4) = 16 * v4;
        *(_BYTE *)(v2 + 5) = v3 + 4;
    }
    return result;
}
я попытался написать ридер таких строк, но увы - не получилось (видать где-то косячу), больше всего смущает такое:
v3 = *(_BYTE *)(this + 5);.
Собственно сам вопрос, от куда считается смещение, от начала потока DataStore или с текущей позиции, или что это вообще за оффсет?
__________________

Последний раз редактировалось Konctantin; 11.03.2013 в 13:07.
Konctantin вне форума   Ответить с цитированием
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IDB WoW 5.2.0 Build 16650 TOM_RUS Копаем клиент 74 26.03.2016 03:04
[12344] More correct help string for .wp show command. newsbot CMaNGOS Commits 0 22.01.2013 19:00
[10773] Fixed crash at empty build list in realm string. newsbot CMaNGOS Commits 0 22.11.2010 01:30
[10429] some format string fixes newsbot CMaNGOS Commits 0 31.08.2010 13:52
[9778] Old gcc hash_map not have support for std::string keys. newsbot CMaNGOS Commits 0 22.04.2010 23:30


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot