PopEtAggregateGet
VOID __stdcall PopEtAggregateGet(INT64 a1, UINT8 *a2, INT64 *a3){
INT64 v6;
INT64 v7;
VOID **PoolWithTag;
INT64 *v9;
unsigned int v10;
__int64 v11;
char *v12;
char *v13;
char v14;
unsigned __int64 v15;
unsigned int v16;
__int64 v17;
__int64 v18;
_QWORD *v19;
__int64 v20;
unsigned int v21;
__int64 v22;
__int64 v23;
int v24;
VOID *v25;
_QWORD *v26;
int v27;
unsigned int v28;
__int64 v29;
__int64 v30;
INT64 v31;
v31 = 0i64;
LODWORD(v6) = PopEtAggregateFind(a1, a2, &v31);
if( v6 )
{
*a3 = v6;
return;
}
v7 = a1 + 48;
if( *(_DWORD *)(a1 + 48) >= *(_DWORD *)(a1 + 32) )
{
++*(_DWORD *)(a1 + 616);
LABEL_34:
++*(_DWORD *)(a1 + 604);
v26 = (_QWORD *)(a1 + 80);
v27 = *(_DWORD *)(a1 + 636);
*a3 = a1 + 80;
if( (v27 & 4) == 0 )
{
*(_DWORD *)(a1 + 636) = v27 | 4;
v28 = *(_DWORD *)(a1 + 52);
v31 = *(_QWORD *)(a1 + 88) & (-1i64 << (v28 & 0x1F));
v29 = *(_QWORD *)(a1 + 56);
v30 = (37
* (BYTE6(v31)
+ 37
* (BYTE5(v31)
+ 37
* (BYTE4(v31)
+ 37 * (BYTE3(v31) + 37 * (BYTE2(v31) + 37 * (BYTE1(v31) + 37 * ((unsigned __int8)v31 + 11623883)))))))
+ HIBYTE(v31)) & ((v28 >> 5) - 1);
*v26 = *(_QWORD *)(v29 + 8 * v30);
*(_QWORD *)(v29 + 8 * v30) = v26;
++*(_DWORD *)v7;
}
return;
}
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x200ui64, 1413836624i64);
v9 = (INT64 *)PoolWithTag;
if( !PoolWithTag )
goto LABEL_34;
memset(PoolWithTag, 0i64, 0x200u);
PopEtAggregateKeyCopy(v9 + 2, a2);
v9[1] = v31;
v10 = *(_DWORD *)(a1 + 52);
v11 = 2 * (v10 >> 5);
if( *(_DWORD *)v7 < (unsigned int)v11 )
goto LABEL_23;
if( (unsigned int)v11 < 4 )
v11 = 4i64;
LODWORD(v12) = PopEtBucketsAllocate(8 * v11);
v13 = v12;
if( v12 )
{
if( (((_DWORD)v11 - 1) & (unsigned int)v11) != 0 )
{
v14 = -1;
do
{
++v14;
LODWORD(v11) = (unsigned int)v11 >> 1;
}
while( (_DWORD)v11 );
v11 = (unsigned int)(1 << v14);
}
if( (unsigned int)v11 > 0x4000000 )
v11 = 0x4000000i64;
v15 = (unsigned int)v11;
if( v12 > &v12[8 * v11] )
v15 = 0i64;
if( v15 )
memset64(v12, v7 | 1, v15);
v16 = 0;
v17 = -1i64 << (*(_BYTE *)(a1 + 52) & 0x1F);
if( (*(_DWORD *)(a1 + 52) & 0xFFFFFFE0) != 0 )
{
do
{
v18 = *(_QWORD *)(a1 + 56);
while( 1 )
{
v19 = *(_QWORD **)(v18 + 8i64 * v16);
if( ((unsigned __int8)v19 & 1) != 0 )
break;
*(_QWORD *)(v18 + 8i64 * v16) = *v19;
v31 = v17 & v19[1];
v20 = (37
* (BYTE6(v31)
+ 37
* (BYTE5(v31)
+ 37
* (BYTE4(v31)
+ 37 * (BYTE3(v31) + 37 * (BYTE2(v31) + 37 * (BYTE1(v31) + 37 * ((unsigned __int8)v31 + 11623883)))))))
+ HIBYTE(v31)) & (unsigned int)(v11 - 1);
*v19 = *(_QWORD *)&v12[8 * v20];
*(_QWORD *)&v12[8 * v20] = v19;
}
++v16;
}
while( v16 < *(_DWORD *)(a1 + 52) >> 5 );
}
v25 = *(VOID **)(a1 + 56);
v10 = (32 * v11) | *(_DWORD *)(a1 + 52) & 0x1F;
*(_QWORD *)(a1 + 56) = v13;
*(_DWORD *)(a1 + 52) = v10;
if( v25 )
{
PopEtBucketsFree(v25);
v10 = *(_DWORD *)(a1 + 52);
}
goto LABEL_23;
}
v10 = *(_DWORD *)(a1 + 52);
if( v10 >= 0x20 )
{
LABEL_23:
v21 = v10;
*a3 = (INT64)v9;
v31 = v9[1] & (-1i64 << (v10 & 0x1F));
v22 = *(_QWORD *)(a1 + 56);
v23 = (37
* (BYTE6(v31)
+ 37
* (BYTE5(v31)
+ 37
* (BYTE4(v31)
+ 37 * (BYTE3(v31) + 37 * (BYTE2(v31) + 37 * (BYTE1(v31) + 37 * ((unsigned __int8)v31 + 11623883)))))))
+ HIBYTE(v31)) & ((v21 >> 5) - 1);
*v9 = *(_QWORD *)(v22 + 8 * v23);
*(_QWORD *)(v22 + 8 * v23) = v9;
v9 = 0i64;
++*(_DWORD *)v7;
v24 = 0;
goto LABEL_24;
}
v24 = -1073741670;
LABEL_24:
if( v9 )
{
PopEtAggregateKeyCleanup(v9 + 2);
ExFreePoolWithTag(v9, 0x54456F50u);
}
if( v24 < 0 )
goto LABEL_34;
}Referenced by:
PopEtEnergyTrackerUpdateAggregate