|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Копаем клиент Копаем клиент |
|
Опции темы | Поиск в этой теме | Опции просмотра |
11.03.2013, 12:58 | #1 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
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. |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |