Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Копаем клиент (http://mangos.ytdb.ru/forumdisplay.php?f=35)
-   -   7.0.3 WDB cache handlers (http://mangos.ytdb.ru/showthread.php?t=9391)

Konctantin 22.07.2016 08:58

7.0.3 WDB cache handlers
 
Разбирая структуру кеша обнаружил что CDataStore::GetFloat заменены на CDataStore::GetInt32, хотя данные в этих полях хранятся в формете float. Я понимаю что в памяти хоть так хоть так будет 4 байта, но это несколько усложнило разбор самих изменений.

вот код хандлера:
Код:

unsigned int __thiscall ClientCache::GetCreatureCacheRow(void *this, int a2, int a3)
{
  void *v3; // esi@1
  int v4; // eax@1
  int v5; // ST08_4@1
  int v6; // eax@1
  int v7; // ST08_4@1
  _DWORD *v8; // ebx@1
  signed int v9; // edi@1
  int v10; // eax@2
  int v11; // ST08_4@2
  int v12; // edi@3
  int v13; // ebx@3
  signed int v14; // esi@3
  int *v15; // ebx@5
  signed int v16; // esi@5
  void *v17; // esi@7
  int v18; // eax@7
  signed int v19; // ebx@7
  int *v20; // esi@7
  int *v21; // ebx@9
  signed int v22; // esi@9
  int v23; // esi@11
  int v24; // xmm0_4@11
  int v25; // xmm0_4@11
  int v26; // ebx@11
  int v27; // eax@11
  int v28; // eax@11
  int v29; // eax@11
  char v30; // ST08_1@11
  int v31; // ST04_4@11
  unsigned int v32; // esi@11
  unsigned int result; // eax@12
  int *v34; // ecx@16
  int v35; // [sp+Ch] [bp-14h]@1
  __int16 v36; // [sp+10h] [bp-10h]@1
  int v37; // [sp+14h] [bp-Ch]@2
  int v38; // [sp+18h] [bp-8h]@1
  void *v39; // [sp+1Ch] [bp-4h]@1

  v3 = this;
  LOBYTE(v38) = 0;
  v39 = this;
  v35 = a2;
  v36 = 2048;
  v4 = CDataStore::GetBits11(v38);              // title len
  LOBYTE(v38) = 0;
  v5 = v38;
  *((_DWORD *)v3 + 1) = v4;
  v6 = CDataStore::GetBits11(v5);              // titleAlt_len
  LOBYTE(v38) = 0;
  v7 = v38;
  *((_DWORD *)v3 + 4) = v6;
  *((_DWORD *)v3 + 7) = CDataStore::GetBits6((int)&v35, v7);// cursorName_len
  v8 = (char *)v3 + 180;
  *((_BYTE *)v3 + 56) = CDataStore::GetBit(&v35) != 0;// racial leader
  v9 = 4;
  do
  {
    LOBYTE(v38) = 0;
    v10 = CDataStore::GetBits11(v38);          // name len
    LOBYTE(v37) = 0;
    v11 = v37;
    *(v8 - 12) = v10;
    *v8 = CDataStore::GetBits11(v11);          // name alt len
    v8 += 3;
    --v9;
  }
  while ( v9 );
  v12 = a2;
  v13 = (int)v3 + 128;
  v14 = 4;
  do
  {
    CDataStore::GetDynamicString(v12, *(_DWORD *)(v13 + 4), a3);// name
    CDataStore::GetDynamicString(v12, *(_DWORD *)(v13 + 52), a3);// name alt
    v13 += 12;
    --v14;
  }
  while ( v14 );
  v15 = (int *)((char *)v39 + 96);
  v16 = 2;
  do
  {
    a2 = 0;
    CDataStore::GetInt32(&a2);                  // flags
    *v15 = a2;
    ++v15;
    --v16;
  }
  while ( v16 );
  a2 = 0;
  CDataStore::GetInt32(&a2);                    // CreatureType
  v17 = v39;
  v18 = a2;
  a2 = 0;
  *((_DWORD *)v39 + 9) = v18;
  CDataStore::GetInt32(&a2);                    // CreatureFamily
  *((_DWORD *)v17 + 10) = a2;
  a2 = 0;
  CDataStore::GetInt32(&a2);                    // Classification
  *((_DWORD *)v17 + 11) = a2;
  v19 = 2;
  v20 = (int *)((char *)v17 + 104);
  do
  {
    a2 = 0;
    CDataStore::GetInt32(&a2);                  // ProxyCreatureID
    *v20 = a2;
    ++v20;
    --v19;
  }
  while ( v19 );
  v21 = (int *)((char *)v39 + 112);
  v22 = 4;
  do
  {
    a2 = 0;
    CDataStore::GetInt32(&a2);                  // CreatureDisplayID
    *v21 = a2;
    ++v21;
    --v22;
  }
  while ( v22 );
  a2 = 0;
  CDataStore::GetInt32(&a2);                    // float HpMulti
  v23 = (int)v39;
  v24 = a2;
  a2 = 0;
  *((_DWORD *)v39 + 12) = v24;
  CDataStore::GetInt32(&a2);                    // float EnergyMulti
  v25 = a2;
  a2 = 0;
  *(_DWORD *)(v23 + 52) = v25;
  CDataStore::GetInt32(&a2);                    // quest item cont
  v26 = v23 + 60;
  sub_60633B(a2);
  a2 = 0;
  CDataStore::GetInt32(&a2);                    // creatureMovementInfoID
  v27 = a2;
  a2 = 0;
  *(_DWORD *)(v23 + 80) = v27;
  CDataStore::GetInt32(&a2);                    // requireExpansion
  v28 = a2;
  a2 = 0;
  *(_DWORD *)(v23 + 84) = v28;
  CDataStore::GetInt32(&a2);                    // questFlag
  v29 = a2;
  a2 = 0;
  *(_DWORD *)(v23 + 88) = v29;
  CDataStore::GetInt32(&a2);                    // unk (legion)
  v30 = a3;
  v31 = *(_DWORD *)(v23 + 4);
  *(_DWORD *)(v23 + 92) = a2;
  CDataStore::GetDynamicString(v12, v31, v30);  // title
  CDataStore::GetDynamicString(v12, *(_DWORD *)(v23 + 16), a3);// title alt
  CDataStore::GetDynamicString(v12, *(_DWORD *)(v23 + 28), a3);// cursor name
  v32 = 0;
  while ( 1 )
  {
    result = *(_DWORD *)(v26 + 16);
    if ( result == -1 )
      result = *(_DWORD *)v26;
    if ( v32 >= result )
      break;
    a3 = 0;
    CDataStore::GetInt32(&a3);                  // QuestItem
    if ( *(_DWORD *)(v26 + 16) == -1 )
      v34 = (int *)(*(_DWORD *)(v26 + 4) + 4 * v32);
    else
      v34 = (int *)(v26 + 4 * v32);
    ++v32;
    *v34 = a3;
  }
  return result;
}



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

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