EmpUpdateRuleState
void __fastcall EmpUpdateRuleState(__int64 a1, __int64 a2){
unsigned int v2;
__int64 v3;
int v4;
char v7;
_QWORD *i;
_QWORD *j;
int *v10;
_QWORD *k;
_QWORD *v12;
v2 = *(_DWORD *)(a1 + 48);
v3 = 0i64;
v4 = *(_DWORD *)(a1 + 16);
v7 = 1;
if( v2 )
{
while( *(int *)(*(_QWORD *)(*(_QWORD *)(a1 + 56) + 8 * v3) + 16i64) > 0 )
{
v3 = (unsigned int)(v3 + 1);
if( (unsigned int)v3 >= v2 )
goto LABEL_2;
}
LABEL_5:
v7 = 0;
}
else
{
LABEL_2:
for( i = *(_QWORD **)(a1 + 64); i; i = (_QWORD *)*i )
{
if( !*(_QWORD *)(*(i - 1) + 16i64) )
goto LABEL_5;
}
for( j = *(_QWORD **)(a1 + 72); j; j = (_QWORD *)*j )
{
if( !*(_BYTE *)(*(j - 1) + 20i64) )
goto LABEL_5;
}
}
if( *(_BYTE *)(a1 + 20) != v7 )
{
v12 = *(_QWORD **)(a1 + 32);
*(_BYTE *)(a1 + 20) = v7;
while( v12 )
{
EmpUpdateRuleState(*(v12 - 1), 0i64);
v12 = (_QWORD *)*v12;
}
}
*(_BYTE *)(a1 + 20) = v7;
if( v7 )
{
if( v4 == 1 )
*(_DWORD *)(a1 + 16) = 0;
v10 = (int *)EmpSearchTargetRuleList(a1);
if( v10 && *v10 > 0 )
EmpEvaluateUpdateRuleEvalState((INT64)v10, a2);
}
else
{
*(_DWORD *)(a1 + 16) = 1;
}
if( *(_DWORD *)(a1 + 16) != v4 )
{
for( k = *(_QWORD **)(a1 + 80); k != (_QWORD *)(a1 + 80); k = (_QWORD *)*k )
((void(__fastcall *)(_QWORD, __int64, _QWORD))*(k - 2))(*(unsigned int *)(a1 + 16), a1, *(k - 1));
}
}Referenced by:
EmClientQueryRuleState
EmpRuleUpdateWorkerThread
EmpUpdateRuleState