PpmHvSnapPerformanceAccumulation

char __fastcall PpmHvSnapPerformanceAccumulation(_QWORD *a1, __int64 a2, __int64 a3, _QWORD *a4){
  char v4; 
  unsigned int v6; 
  _HVLP_LPCB *LpcbByLpIndex; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  _QWORD *v12; 
  __int64 v13; 
  char *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  unsigned int v22; 
  __int64 v23; 
  __int64 v24; 
  char v27; 

  v4 = 0;
  v6 = *(_DWORD *)(a1[1] + 20i64);
  v22 = v6;
  v23 = 2i64;
  while( 1 )
  {
    while( HvlGetStatsUpdateCounter(v6) )
      ;
    HvlGetReferenceTime();
    LpcbByLpIndex = HvlpGetLpcbByLpIndex(v6);
    if( LpcbByLpIndex )
    {
      v9 = *((_QWORD *)LpcbByLpIndex + 4);
      v8 = *(_QWORD *)(v9 + 8i64 * (unsigned int)qword_140CED110);
      v24 = *(_QWORD *)(v9 + 8i64 * HIDWORD(qword_140CED110));
    }
    else
    {
      v8 = 0i64;
      v24 = 0i64;
    }
    if( !HvlGetStatsUpdateCounter(v22) )
      break;
    v6 = v22;
  }
  if( !a3 )
  {
    a1[9] = 0i64;
    v10 = -v8;
    v11 = -v8 - a1[10];
    a1[10] = v10;
    if( v11 )
    {
      v12 = a1 + 14;
      v13 = 2i64;
      v14 = &v27;
      do
      {
        v15 = *(v12 - 3);
        if( v15 )
        {
          if( *(_BYTE *)(v15 + 33) )
          {
            v16 = *((_QWORD *)v14 - 2);
            v17 = *(_QWORD *)(v15 + 16);
            if( v16 == v17 )
            {
              LODWORD(v19) = *(_DWORD *)(v15 + 24);
            }
            else
            {
              v18 = *((_QWORD *)v14 - 1) - *(_QWORD *)(v15 + 8);
              *(_QWORD *)(v15 + 16) = v16;
              *(_QWORD *)(v15 + 8) = *((_QWORD *)v14 - 1);
              v19 = v18 * (unsigned __int64)*(unsigned __int8 *)(v15 + 35) / (v16 - v17);
              *(_DWORD *)(v15 + 24) = v19;
            }
            *(_DWORD *)v14 = v19;
          }
          else
          {
            LODWORD(v19) = *(_DWORD *)v14;
          }
          v13 = v23;
          *v12 += v11 * (unsigned int)v19;
        }
        ++v12;
        v14 += 24;
        v23 = --v13;
      }
      while( v13 );
    }
    if( a1[11] )
    {
      v20 = a1[14];
    }
    else if( a1[12] )
    {
      v20 = a1[15];
    }
    else
    {
      v20 = 100i64 * a1[13];
    }
    a4[3] = v20;
    if( a1[12] )
      v20 = a1[15];
    a4[4] = v20;
    v4 = 1;
    a4[6] = v24;
    *a4 = 0i64;
    a4[1] = v10;
  }
  return v4;
}

Referenced by:

PpmCheckSnapAllDeliveredPerformance
PpmPerfSnapDeliveredPerformance
PpmResetPerfTimes