EtwpCovSampProfileInterrupt

CHAR __fastcall EtwpCovSampProfileInterrupt(INT64 a1, INT64 a2){
  struct _KPRCB *CurrentPrcb; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v5; 
  unsigned int v6; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned int LowPart; 
  int v11; 
  int v12; 
  int v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned int v16; 
  int v17; 
  int v18; 
  void *v19; 
  CurrentPrcb = KeGetCurrentPrcb();
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( CurrentThread != *((_ETHREAD **)CurrentPrcb + 3) || *((_BYTE *)CurrentPrcb + 32) > 1u )
  {
    v5 = *(_QWORD *)(a2 + 8);
    v6 = ((unsigned int)v5 >> 13) & 0x3FFFF;
    _BitScanReverse(&v7, v6);
    v8 = (v5 >> 4) & 0x1FF;
    v9 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentPrcb() + 4198) + 8i64 * (v7 - 2)) + 8i64 * (v6 ^ (1 << v7)) + 8);
    if( !*(_DWORD *)(v9 + 8 * v8 + 144) )
    {
LABEL_13:
      v19 = *(void **)(a1 + 360);
      _InterlockedIncrement((volatile signed __int32 *)(v9 + 8 * v8 + 320));
      LOBYTE(CurrentThread) = EtwpCovSampCaptureSample(v19, 0x50000002ui64);
      return(char)CurrentThread;
    }
    LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
    LODWORD(CurrentThread) = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(v9 + 8 * v8 + 148);
    if( (unsigned int)CurrentThread > *(_DWORD *)(v9 + 8 * v8 + 152) )
    {
      v11 = *(_DWORD *)(v9 + 8 * v8 + 144);
      *(_DWORD *)(v9 + 8 * v8 + 164) += v11;
      v12 = *(_DWORD *)(v9 + 8 * v8 + 164);
      v13 = *(_DWORD *)(v9 + 8 * v8 + 160);
      LODWORD(CurrentThread) = 2 * v11;
      if( v12 > *(_DWORD *)(v9 + 8 * v8 + 156) )
        v12 = *(_DWORD *)(v9 + 8 * v8 + 156);
      *(_DWORD *)(v9 + 8 * v8 + 148) = LowPart;
      v14 = *(_DWORD *)(v9 + 8 * v8 + 172) + v13;
      *(_DWORD *)(v9 + 8 * v8 + 160) = 0;
      v15 = v14 >> 1;
      *(_DWORD *)(v9 + 8 * v8 + 164) = v12;
      *(_DWORD *)(v9 + 8 * v8 + 172) = v15;
      if( v15 >= (unsigned int)CurrentThread )
      {
        v16 = v15 / (v11 + 1);
        v17 = 16777619 * (*(_DWORD *)(v9 + 8 * v8 + 180) ^ LowPart);
        *(_DWORD *)(v9 + 8 * v8 + 176) = v16;
        LODWORD(CurrentThread) = v17 & (2 * v16);
        *(_DWORD *)(v9 + 8 * v8 + 180) = v17;
        *(_DWORD *)(v9 + 8 * v8 + 168) = (_DWORD)CurrentThread;
      }
      else
      {
        *(_DWORD *)(v9 + 8 * v8 + 176) = 1;
        *(_DWORD *)(v9 + 8 * v8 + 168) = 1;
      }
    }
    ++*(_DWORD *)(v9 + 8 * v8 + 160);
    v18 = *(_DWORD *)(v9 + 8 * v8 + 164);
    if( v18 > 0 )
    {
      LODWORD(CurrentThread) = --*(_DWORD *)(v9 + 8 * v8 + 168);
      if( (int)CurrentThread <= 0 )
      {
        *(_DWORD *)(v9 + 8 * v8 + 164) = v18 - 1;
        *(_DWORD *)(v9 + 8 * v8 + 168) = *(_DWORD *)(v9 + 8 * v8 + 176);
        goto LABEL_13;
      }
    }
  }
  return(char)CurrentThread;
}

Referenced by:

No references.