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