PopEtProcessSnapshotCreate
NTSTATUS __stdcall PopEtProcessSnapshotCreate(INT64 a1, INT64 **a2){
__int64 v2;
INT64 **v3;
_EPROCESS *v4;
VOID **PoolWithTag;
INT64 *v6;
unsigned __int64 v7;
unsigned int v8;
__int64 v9;
char *v10;
char *v11;
char v12;
unsigned __int64 v13;
unsigned int v14;
__int64 v15;
__int64 v16;
_QWORD *v17;
__int64 v18;
__int64 v19;
__int64 v20;
NTSTATUS v21;
VOID *v23;
__int64 v24;
__int64 v25;
v2 = *(_QWORD *)(a1 + 16);
v3 = a2;
v4 = *(_EPROCESS **)(a1 + 8);
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x1F0ui64, 1413836624i64);
v6 = (INT64 *)PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, 0x1F0u);
v6[1] = (INT64)v4;
PopEtAggregateKeyCopyFromProcess(v6 + 2, v4, v2 + 32);
PopEtStringSet(v6 + 3, 0i64);
v7 = v2 + 64;
v8 = *(_DWORD *)(v2 + 68);
v9 = 2 * (v8 >> 5);
if( *(_DWORD *)(v2 + 64) < (unsigned int)v9 )
goto LABEL_21;
if( (unsigned int)v9 < 4 )
v9 = 4i64;
LODWORD(v10) = PopEtBucketsAllocate(8 * v9);
v11 = v10;
if( v10 )
{
if( (((_DWORD)v9 - 1) & (unsigned int)v9) != 0 )
{
v12 = -1;
do
{
++v12;
LODWORD(v9) = (unsigned int)v9 >> 1;
}
while( (_DWORD)v9 );
v9 = (unsigned int)(1 << v12);
}
if( (unsigned int)v9 > 0x4000000 )
v9 = 0x4000000i64;
v13 = (unsigned int)v9;
if( v10 > &v10[8 * v9] )
v13 = 0i64;
if( v13 )
memset64(v10, v7 | 1, v13);
v14 = 0;
v15 = -1i64 << (*(_BYTE *)(v2 + 68) & 0x1F);
if( (*(_DWORD *)(v2 + 68) & 0xFFFFFFE0) != 0 )
{
do
{
v16 = *(_QWORD *)(v2 + 72);
while( 1 )
{
v17 = *(_QWORD **)(v16 + 8i64 * v14);
if( ((unsigned __int8)v17 & 1) != 0 )
break;
*(_QWORD *)(v16 + 8i64 * v14) = *v17;
v24 = v15 & v17[1];
v18 = (37
* (BYTE6(v24)
+ 37
* (BYTE5(v24)
+ 37
* (BYTE4(v24)
+ 37 * (BYTE3(v24) + 37 * (BYTE2(v24) + 37 * (BYTE1(v24) + 37 * ((unsigned __int8)v24 + 11623883)))))))
+ HIBYTE(v24)) & (unsigned int)(v9 - 1);
*v17 = *(_QWORD *)&v10[8 * v18];
*(_QWORD *)&v10[8 * v18] = v17;
}
++v14;
}
while( v14 < *(_DWORD *)(v2 + 68) >> 5 );
v3 = a2;
}
v23 = *(VOID **)(v2 + 72);
v8 = (32 * v9) | *(_DWORD *)(v2 + 68) & 0x1F;
*(_QWORD *)(v2 + 72) = v11;
*(_DWORD *)(v2 + 68) = v8;
if( v23 )
{
PopEtBucketsFree(v23);
v8 = *(_DWORD *)(v2 + 68);
}
goto LABEL_21;
}
v8 = *(_DWORD *)(v2 + 68);
if( v8 >= 0x20 )
{
LABEL_21:
*v3 = v6;
v25 = v6[1] & (-1i64 << (v8 & 0x1F));
v19 = *(_QWORD *)(v2 + 72);
v20 = (37
* (BYTE6(v25)
+ 37
* (BYTE5(v25)
+ 37
* (BYTE4(v25)
+ 37 * (BYTE3(v25) + 37 * (BYTE2(v25) + 37 * (BYTE1(v25) + 37 * ((unsigned __int8)v25 + 11623883)))))))
+ HIBYTE(v25)) & ((v8 >> 5) - 1);
*v6 = *(_QWORD *)(v19 + 8 * v20);
*(_QWORD *)(v19 + 8 * v20) = v6;
++*(_DWORD *)v7;
return 0;
}
}
++*(_DWORD *)(v2 + 612);
v21 = -1073741670;
if( v6 )
{
PopEtAggregateKeyCleanup(v6 + 2);
ExFreePoolWithTag(v6, 0x54456F50u);
}
return v21;
}Referenced by:
PopEtProcessSnapshotUpdate