PDA

Просмотр полной версии : CMSG_GET_MIRRORIMAGE_DATA


HuntsMan
27.07.2011, 14:23
Пытаюсь понять при каких условиях клиент посылает 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] @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) )
[B]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 )

Deamon
27.07.2011, 14:34
Я думаю, что это unit_flags, а вот это что за махинация я не могу понять:(
if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )

if (v9[248][280] & ( 1u << 4) )
где v9 - это DWORD**

TOM_RUS
27.07.2011, 14:34
if ( !(*(_DWORD *)(v9 + 2824) & 0x20000) )

Это какие-то внутренние клиентские флаги...

if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )

Это
if(unit->data->UNIT_FIELD_FLAGS_2 & UNIT_FLAG2_CLONED)

HuntsMan
27.07.2011, 14:46
Это какие-то внутренние клиентские флаги...
Т.е. на них можно забить?