EtwpCoverageSamplerReadyThread

CHAR __stdcall EtwpCoverageSamplerReadyThread(INT64 a1){
  _ETHREAD *CurrentThread; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v3; 
  unsigned int v4; 
  unsigned int v5; 
  __int64 v6; 
  unsigned int LowPart; 
  int v8; 
  int v9; 
  int v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  int v15; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (_ETHREAD *)**(&ExBootDevicesRemovedEvent + 153) != CurrentThread && **(&ExBootDevicesRemovedEvent + 153) != a1 )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( CurrentThread != CurrentPrcb->IdleThread || CurrentPrcb->NestingLevel > 1u )
    {
      v3 = (*(_QWORD *)(*(&ExBootDevicesRemovedEvent + 153) + 8i64) >> 4) & 0x1FFi64;
      v4 = ((unsigned int)*(_QWORD *)(*(&ExBootDevicesRemovedEvent + 153) + 8i64) >> 13) & 0x3FFFF;
      _BitScanReverse(&v5, v4);
      v6 = *(_QWORD *)(*((_QWORD *)KeGetCurrentPrcb()->ExSaPageArray + v5 - 2) + 8i64 * (v4 ^ (1 << v5)) + 8);
      if( !*(_DWORD *)(v6 + 8 * v3 + 224) )
      {
LABEL_15:
        _InterlockedIncrement((volatile signed __int32 *)(v6 + 8 * v3 + 328));
        LOBYTE(CurrentThread) = EtwpCovSampCaptureSample(0i64, 0x30000008ui64);
        return(char)CurrentThread;
      }
      LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
      LODWORD(CurrentThread) = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(v6 + 8 * v3 + 228);
      if( (unsigned int)CurrentThread > *(_DWORD *)(v6 + 8 * v3 + 232) )
      {
        v8 = *(_DWORD *)(v6 + 8 * v3 + 224);
        *(_DWORD *)(v6 + 8 * v3 + 244) += v8;
        v9 = *(_DWORD *)(v6 + 8 * v3 + 244);
        v10 = *(_DWORD *)(v6 + 8 * v3 + 240);
        LODWORD(CurrentThread) = 2 * v8;
        if( v9 > *(_DWORD *)(v6 + 8 * v3 + 236) )
          v9 = *(_DWORD *)(v6 + 8 * v3 + 236);
        *(_DWORD *)(v6 + 8 * v3 + 228) = LowPart;
        v11 = *(_DWORD *)(v6 + 8 * v3 + 252) + v10;
        *(_DWORD *)(v6 + 8 * v3 + 240) = 0;
        v12 = v11 >> 1;
        *(_DWORD *)(v6 + 8 * v3 + 244) = v9;
        *(_DWORD *)(v6 + 8 * v3 + 252) = v12;
        if( v12 >= (unsigned int)CurrentThread )
        {
          v13 = v12 / (v8 + 1);
          v14 = 16777619 * (*(_DWORD *)(v6 + 8 * v3 + 260) ^ LowPart);
          *(_DWORD *)(v6 + 8 * v3 + 256) = v13;
          LODWORD(CurrentThread) = v14 & (2 * v13);
          *(_DWORD *)(v6 + 8 * v3 + 260) = v14;
          *(_DWORD *)(v6 + 8 * v3 + 248) = (_DWORD)CurrentThread;
        }
        else
        {
          *(_DWORD *)(v6 + 8 * v3 + 256) = 1;
          *(_DWORD *)(v6 + 8 * v3 + 248) = 1;
        }
      }
      ++*(_DWORD *)(v6 + 8 * v3 + 240);
      v15 = *(_DWORD *)(v6 + 8 * v3 + 244);
      if( v15 > 0 )
      {
        LODWORD(CurrentThread) = --*(_DWORD *)(v6 + 8 * v3 + 248);
        if( (int)CurrentThread <= 0 )
        {
          *(_DWORD *)(v6 + 8 * v3 + 244) = v15 - 1;
          *(_DWORD *)(v6 + 8 * v3 + 248) = *(_DWORD *)(v6 + 8 * v3 + 256);
          goto LABEL_15;
        }
      }
    }
  }
  return(char)CurrentThread;
}

Referenced by:

EtwTraceReadyThread