EmpEvaluateUpdateRuleEvalState
VOID __fastcall EmpEvaluateUpdateRuleEvalState(INT64 a1, INT64 a2){
__int64 v2;
int v3;
char *PoolWithTag;
__int64 v7;
unsigned int v8;
__int64 v9;
_QWORD **v10;
_QWORD *v11;
__int64 i;
__int64 v13;
__int64 v14;
__int64 v15;
v2 = *(_QWORD *)(a1 + 8);
v3 = 0;
PoolWithTag = 0i64;
v7 = *(unsigned int *)(v2 + 48);
if( *(_BYTE *)(v2 + 20) )
{
v8 = 0;
if( (_DWORD)v7 )
{
v9 = *(_QWORD *)(v2 + 56);
do
{
v10 = (_QWORD **)(*(_QWORD *)&PoolWithTag[v9] + 56i64);
v11 = *v10;
while( v11 != v10 )
{
((void(__fastcall *)(_QWORD, _QWORD))*(v11 - 2))(*(_QWORD *)&PoolWithTag[*(_QWORD *)(v2 + 56)], *(v11 - 1));
v9 = *(_QWORD *)(v2 + 56);
v11 = (_QWORD *)*v11;
v10 = (_QWORD **)(*(_QWORD *)&PoolWithTag[v9] + 56i64);
}
if( *(_QWORD *)(*(_QWORD *)&PoolWithTag[v9] + 40i64) == *(_QWORD *)&PoolWithTag[v9] + 40i64 )
{
*(_DWORD *)(v2 + 16) = 0;
return;
}
++v8;
PoolWithTag += 8;
}
while( v8 < (unsigned int)v7 );
PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 8 * v7, 0x76654D45ui64);
if( PoolWithTag )
{
for( i = 0i64; (unsigned int)i < *(_DWORD *)(v2 + 48); i = (unsigned int)(i + 1) )
{
v13 = *(_QWORD *)(*(_QWORD *)(v2 + 56) + 8 * i);
if( v13 != a2 )
*(_QWORD *)(v13 + 32) = *(_QWORD *)(v13 + 40);
}
goto LABEL_20;
}
}
else
{
while( (unsigned int)EmpEvaluateTargetRule(a1, (__int64)PoolWithTag, v7) != 2 )
{
if( EmpEvaluatePermuteRuleEntries(v2, v7, a2, 0) )
goto LABEL_5;
LABEL_20:
if( (_DWORD)v7 )
{
v14 = 0i64;
v15 = v7;
do
{
*(_QWORD *)&PoolWithTag[v14] = *(_QWORD *)(*(_QWORD *)(v14 + *(_QWORD *)(v2 + 56)) + 32i64) - 16i64;
v14 += 8i64;
--v15;
}
while( v15 );
}
}
v3 = 2;
LABEL_5:
*(_DWORD *)(v2 + 16) = v3;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x76654D45u);
}
}
else
{
*(_DWORD *)(v2 + 16) = 1;
}
}Referenced by:
EmpUpdateRuleState