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