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