Показать сообщение отдельно
Старый 12.07.2013, 00:17   #24
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

Там ничего особенного нет, также сначала считывается маска, потом байты
Посмотри опкод попроще, например CMSG_BATTLEMASTER_JOIN
Код:
char __thiscall PH_CMSG_BATTLEMASTER_JOIN(void *this, int a2)
{
  char v2; // al@1
  void *v3; // esi@1
  char v4; // zf@1
  char v5; // zf@1
  char v6; // al@3
  char v7; // al@5
  char v8; // al@7
  char v9; // al@9
  char v10; // al@11
  char v11; // al@13
  char result; // al@15
  int v13; // [sp+8h] [bp-8h]@1
  int v14; // [sp+Ch] [bp-4h]@1

  v3 = this;
  CDataStore__PutInt32(30978);
  CDataStore__PutInt32(*((_DWORD *)v3 + 4));
  v4 = *((_BYTE *)v3 + 26) == 0;
  v13 = a2;
  LOBYTE(v14) = 2
              * (2
               * (*((_BYTE *)v3 + 20) | 2
                                      * (2
                                       * (2 * (2 * (2 * !v4 | *((_BYTE *)v3 + 24) != 0) | *((_BYTE *)v3 + 27) != 0) | *((_BYTE *)v3 + 25) != 0) | *((_BYTE *)v3 + 29) != 0)) | *((_BYTE *)v3 + 28) != 0) | *((_BYTE *)v3 + 30) != 0;
  CDataStore__PutInt8(v14);
  v5 = *((_BYTE *)v3 + 31) == 0;
  BYTE1(v14) = 1;
  LOBYTE(v14) = !v5;
  sub_66ADB0(&v13);
  v2 = *((_BYTE *)v3 + 26);
  if ( v2 )
    CDataStore__PutInt8(v2 ^ 1);
  v6 = *((_BYTE *)v3 + 30);
  if ( v6 )
    CDataStore__PutInt8(v6 ^ 1);
  v7 = *((_BYTE *)v3 + 28);
  if ( v7 )
    CDataStore__PutInt8(v7 ^ 1);
  v8 = *((_BYTE *)v3 + 27);
  if ( v8 )
    CDataStore__PutInt8(v8 ^ 1);
  v9 = *((_BYTE *)v3 + 31);
  if ( v9 )
    CDataStore__PutInt8(v9 ^ 1);
  v10 = *((_BYTE *)v3 + 24);
  if ( v10 )
    CDataStore__PutInt8(v10 ^ 1);
  v11 = *((_BYTE *)v3 + 29);
  if ( v11 )
    CDataStore__PutInt8(v11 ^ 1);
  result = *((_BYTE *)v3 + 25);
  if ( result )
    result = CDataStore__PutInt8(result ^ 1);
  return result;
}
Код:
00000000 CMSG_BATTLEMASTER_JOIN_struct struc ; (sizeof=0x20)
00000000 f0              db 16 dup(?)
00000010 instanceId      dd ?
00000014 asGroup         db ?
00000015 f15             db 3 dup(?)
00000018 guid            db 8 dup(?)             ; string(C)
00000020 CMSG_BATTLEMASTER_JOIN_struct ends
Код:
char __thiscall PH_CMSG_BATTLEMASTER_JOIN(void *this, int a2)
{
  char v2; // al@1
  CMSG_BATTLEMASTER_JOIN_struct *v3; // esi@1
  char v4; // zf@1
  char v5; // zf@1
  char v6; // al@3
  char v7; // al@5
  char v8; // al@7
  char v9; // al@9
  char v10; // al@11
  char v11; // al@13
  char result; // al@15
  int v13; // [sp+8h] [bp-8h]@1
  int v14; // [sp+Ch] [bp-4h]@1

  v3 = (CMSG_BATTLEMASTER_JOIN_struct *)this;
  CDataStore__PutInt32(30978);
  CDataStore__PutInt32(v3->instanceId);
  v4 = v3->guid[2] == 0;
  v13 = a2;
  LOBYTE(v14) = 2
              * (2
               * (v3->asGroup | 2
                              * (2 * (2 * (2 * (2 * !v4 | v3->guid[0] != 0) | v3->guid[3] != 0) | v3->guid[1] != 0) | v3->guid[5] != 0)) | v3->guid[4] != 0) | v3->guid[6] != 0;
  CDataStore__PutInt8(v14);
  v5 = v3->guid[7] == 0;
  BYTE1(v14) = 1;
  LOBYTE(v14) = !v5;
  sub_66ADB0(&v13);
  v2 = v3->guid[2];
  if ( v2 )
    CDataStore__PutInt8(v2 ^ 1);
  v6 = v3->guid[6];
  if ( v6 )
    CDataStore__PutInt8(v6 ^ 1);
  v7 = v3->guid[4];
  if ( v7 )
    CDataStore__PutInt8(v7 ^ 1);
  v8 = v3->guid[3];
  if ( v8 )
    CDataStore__PutInt8(v8 ^ 1);
  v9 = v3->guid[7];
  if ( v9 )
    CDataStore__PutInt8(v9 ^ 1);
  v10 = v3->guid[0];
  if ( v10 )
    CDataStore__PutInt8(v10 ^ 1);
  v11 = v3->guid[5];
  if ( v11 )
    CDataStore__PutInt8(v11 ^ 1);
  result = v3->guid[1];
  if ( result )
    result = CDataStore__PutInt8(result ^ 1);
  return result;
}

Последний раз редактировалось Amaru; 12.07.2013 в 00:24.
Amaru вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Dubstep (13.07.2013)