Показать сообщение отдельно
Старый 27.07.2011, 14:23   #1
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию CMSG_GET_MIRRORIMAGE_DATA

Пытаюсь понять при каких условиях клиент посылает CMSG_GET_MIRRORIMAGE_DATA. Нашел вот такой кусок:
Код:
signed int __usercall sub_5D2890<eax>(int a1<ecx>, double a2<st6>, double a3<st5>, double a4<st4>, double a5<st3>, double a6<st2>, double a7<st1>)
{
  int v7; // ecx@1
  int v8; // ebx@1
  int v9; // esi@1
  int v10; // eax@2
  int v11; // eax@3
  signed int result; // eax@9
  signed int v13; // edi@25
  int v14; // eax@26
  int v15; // eax@30
  int v16; // [sp-4h] [bp-14h]@11
  int v17; // [sp+8h] [bp-8h]@30
  int v18; // [sp+Ch] [bp-4h]@30

  v9 = a1;
  v7 = *(_DWORD *)(a1 + 204);
  v8 = 0;
  if ( !v7 || (sub_77A9E0(v7), !v10) )
    return 0;
  v11 = *(_DWORD *)(v9 + 3084);
  *(_DWORD *)(v9 + 2824) &= 0xFFBFFFFFu;
  if ( v11 )
  {
    sub_66A320(v11);
    *(_DWORD *)(v9 + 3084) = 0;
  }
  if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )
  {
    if ( !(*(_DWORD *)(v9 + 2824) & 0x20000) )
      CGUnit_C__RequestMirrorImageData((void *)v9);
    *(_DWORD *)(v9 + 2824) |= 0x400000u;
    return 0;
  }
  if ( sub_5B8CC0(v9) )
  {
    v16 = 1;
LABEL_18:
    sub_5BD0A0(v9, v9, v16);
    goto LABEL_19;
  }
  if ( *(_DWORD *)(v9 + 2604) )
  {
    result = sub_5BD0A0(v9, 0, 1);
    if ( !result )
      return result;
    goto LABEL_19;
  }
  if ( ((unsigned int)*(_WORD *)(*(_DWORD *)(v9 + 8) + 8) >> 4) & 1 && *(_BYTE *)(*(_DWORD *)(v9 + 2608) + 4) & 4 )
  {
    v16 = 0;
    goto LABEL_18;
  }
LABEL_19:
  if ( !(((unsigned int)*(_WORD *)(*(_DWORD *)(v9 + 8) + 8) >> 4) & 1) || !sub_575BA0(v9, a2, a3, a4, a5, a6, a7) )
  {
    if ( !sub_573210() || !CGUnit_C__sub_5BC230(v9) )
    {
      if ( *(_DWORD *)(v9 + 3084) )
      {
        if ( *(_DWORD *)(v9 + 2604) )
        {
          v13 = 32;
          do
          {
            v14 = *(_DWORD *)(v13 + *(_DWORD *)(v9 + 2604));
            if ( v14 )
              sub_66B510(*(void **)(v9 + 3084), v8, v14, 0);
            v13 += 4;
            ++v8;
          }
          while ( (unsigned int)v13 < 0x4C );
        }
      }
    }
    sub_5D02B0(v9, a2, a3, a4, a5, a6, a7, 0);
    sub_5D02B0(v9, a2, a3, a4, a5, a6, a7, 1);
    sub_5D02B0(v9, a2, a3, a4, a5, a6, a7, 2);
  }
  sub_5B54F0(v9);
  v15 = *(_DWORD *)(v9 + 8);
  v17 = *(_DWORD *)v15;
  v18 = *(_DWORD *)(v15 + 4);
  sub_8262B0((int)&v17, 3);
  sub_5C1F50(v9);
  return 1;
}
Код:
if ( !(*(_DWORD *)(v9 + 2824) & 0x20000) )
Я думаю, что это unit_flags, а вот это что за махинация я не могу понять
Код:
if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )

Последний раз редактировалось HuntsMan; 27.07.2011 в 14:30.
HuntsMan вне форума   Ответить с цитированием