PopEtProcessSnapshotCreate

INT64 __fastcall PopEtProcessSnapshotCreate(INT64 a1, INT64 **a2){
  __int64 v2; 
  INT64 **v3; 
  __int64 v4; 
  INT64 *PoolWithTag; 
  INT64 *v6; 
  unsigned __int64 v7; 
  unsigned int v8; 
  __int64 v9; 
  char *v10; 
  char v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  __int64 v14; 
  __int64 v15; 
  _QWORD *v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned int v20; 
  VOID *v22; 
  __int64 v23; 
  __int64 v24; 
  v2 = *(_QWORD *)(a1 + 16);
  v3 = a2;
  v4 = *(_QWORD *)(a1 + 8);
  PoolWithTag = (INT64 *)ExAllocatePoolWithTag(PagedPool, 0x1F0ui64, 0x54456F50ui64);
  v6 = PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)PoolWithTag, 0i64);
    v6[1] = 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;
    v10 = (char *)PopEtBucketsAllocate(8i64 * (unsigned int)v9);
    if( v10 )
    {
      if( (((_DWORD)v9 - 1) & (unsigned int)v9) != 0 )
      {
        v11 = -1;
        do
        {
          ++v11;
          LODWORD(v9) = (unsigned int)v9 >> 1;
        }
        while( (_DWORD)v9 );
        v9 = (unsigned int)(1 << v11);
      }
      if( (unsigned int)v9 > 0x4000000 )
        v9 = 0x4000000i64;
      v12 = (unsigned int)v9;
      if( v10 > &v10[8 * v9] )
        v12 = 0i64;
      if( v12 )
        memset64(v10, v7 | 1, v12);
      v13 = 0;
      v14 = -1i64 << (*(_BYTE *)(v2 + 68) & 0x1F);
      if( (*(_DWORD *)(v2 + 68) & 0xFFFFFFE0) != 0 )
      {
        do
        {
          v15 = *(_QWORD *)(v2 + 72);
          while( 1 )
          {
            v16 = *(_QWORD **)(v15 + 8i64 * v13);
            if( ((unsigned __int8)v16 & 1) != 0 )
              break;
            *(_QWORD *)(v15 + 8i64 * v13) = *v16;
            v23 = v14 & v16[1];
            v17 = (37
                 * (BYTE6(v23)
                  + 37
                  * (BYTE5(v23)
                   + 37
                   * (BYTE4(v23)
                    + 37 * (BYTE3(v23) + 37 * (BYTE2(v23) + 37 * (BYTE1(v23) + 37 * ((unsigned __int8)v23 + 11623883)))))))
                 + HIBYTE(v23)) & (unsigned int)(v9 - 1);
            *v16 = *(_QWORD *)&v10[8 * v17];
            *(_QWORD *)&v10[8 * v17] = v16;
          }
          ++v13;
        }
        while( v13 < *(_DWORD *)(v2 + 68) >> 5 );
        v3 = a2;
      }
      v22 = *(VOID **)(v2 + 72);
      v8 = (32 * v9) | *(_DWORD *)(v2 + 68) & 0x1F;
      *(_QWORD *)(v2 + 72) = v10;
      *(_DWORD *)(v2 + 68) = v8;
      if( v22 )
      {
        PopEtBucketsFree(v22);
        v8 = *(_DWORD *)(v2 + 68);
      }
      goto LABEL_21;
    }
    v8 = *(_DWORD *)(v2 + 68);
    if( v8 >= 0x20 )
    {
LABEL_21:
      *v3 = v6;
      v24 = v6[1] & (-1i64 << (v8 & 0x1F));
      v18 = *(_QWORD *)(v2 + 72);
      v19 = (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)) & ((v8 >> 5) - 1);
      *v6 = *(_QWORD *)(v18 + 8 * v19);
      *(_QWORD *)(v18 + 8 * v19) = v6;
      ++*(_DWORD *)v7;
      return 0;
    }
  }
  ++*(_DWORD *)(v2 + 612);
  v20 = -1073741670;
  if( v6 )
  {
    PopEtAggregateKeyCleanup(v6 + 2);
    ExFreePoolWithTag(v6, 0x54456F50u);
  }
  return v20;
}

Referenced by:

PopEtProcessSnapshotUpdate