KiEndThreadAccountingPeriod

VOID __stdcall KiEndThreadAccountingPeriod(_KPRCB *Prcb, _ETHREAD *Thread, UINT64 NetCycles){
  char v3; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned int v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  _QWORD *v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int v18; 
  __int64 v19; 
  _QWORD *i; 
  int v21; 
  __int64 v22; 
  __int64 v23; 
  v3 = *((_BYTE *)Thread + 2);
  if( (v3 & 0x10) != 0 )
  {
    *((_QWORD *)Prcb + *((unsigned __int8 *)Thread + 124) + 4058) += *((_QWORD *)Prcb + 4056) - *((_QWORD *)Prcb + 4057);
    v3 &= ~0x10u;
    *((_QWORD *)Prcb + 4057) = 0i64;
  }
  if( (v3 & 0x20) != 0 )
  {
    v6 = *((_QWORD *)Thread + 191);
    if( v6 )
    {
      v7 = *((_QWORD *)Prcb + 4141);
      v8 = *((_QWORD *)Prcb + 4142);
      if( v7 && v8 )
      {
        if( *(_BYTE *)(v8 + 100) )
        {
          v9 = *(_DWORD *)(v8 + 116);
        }
        else
        {
          v9 = *(_DWORD *)(v8 + 72);
          if( v9 >= *(_DWORD *)(v7 + 368) )
            v9 = *(_DWORD *)(v7 + 368);
        }
      }
      else
      {
        v9 = 100;
      }
      if( v9 < 0x4B )
        v10 = v9 / 0x19;
      else
        v10 = 3;
      v11 = *((unsigned __int8 *)Prcb + 33208);
      v12 = v10;
      v13 = v11 + 2i64 * v10;
      v14 = *(_QWORD *)(v6 + 8 * v13);
      v15 = (_QWORD *)(v6 + 8 * v13);
      v16 = KiTimelineBitmapTime;
      *v15 = NetCycles + v14;
      v17 = *(_DWORD *)(v6 + 192);
      if( v16 > v17 )
      {
        LODWORD(v23) = v16;
        if( v16 - v17 >= 0x20 )
          v21 = 1;
        else
          v21 = (*(_DWORD *)(v6 + 196) << (v16 - v17)) | 1;
        HIDWORD(v23) = v21;
        *(_QWORD *)(v6 + 192) = v23;
      }
      else
      {
        v18 = v17 - v16;
        if( v18 < 0x20 )
          *(_DWORD *)(v6 + 196) |= 1 << v18;
      }
      if( !KiEfficiencyClassSystem && (unsigned __int8)*((_DWORD *)Thread + 128) == 2 )
        *(_QWORD *)(v6 + 16 * v12 + 8) += NetCycles;
      if( *((_QWORD *)Thread + 184) )
      {
        *(_QWORD *)(v6 + 8 * (v11 + 16 + 2 * v12)) += NetCycles;
        _InterlockedExchangeAdd64(
          (volatile signed __int64 *)(*(_QWORD *)(*((_QWORD *)Thread + 184) + 1528i64) + 8 * (v11 + 8 + 2 * v12)),
          NetCycles);
      }
    }
    v3 &= ~0x20u;
  }
  if( (v3 & 0x40) != 0 )
  {
    v22 = *((_QWORD *)Thread + 121);
    if( v22 )
      *(_BYTE *)(v22 + 64) = 0;
    v3 &= ~0x40u;
  }
  if( (v3 & 0x3E) != 0 )
  {
    v19 = *((_QWORD *)Thread + 13);
    if( v19 )
    {
      for( i = (_QWORD *)(*((unsigned int *)Prcb + 54) + v19); i; i = (_QWORD *)i[51] )
        *i += NetCycles;
    }
    if( (*((_BYTE *)Thread + 2) & 8) != 0
      && (*((_QWORD *)Thread + 72) & *(_QWORD *)(*((_QWORD *)Prcb + 24) + 136i64)) != *(_QWORD *)(*((_QWORD *)Prcb + 24)
                                                                                                + 136i64) )
    {
      *((_QWORD *)Prcb + 4061) += NetCycles;
    }
    if( *((_BYTE *)Thread + 125) )
    {
      if( (unsigned __int8)*((_DWORD *)Thread + 128) == 2 )
        *((_QWORD *)Prcb + 4063) += NetCycles;
      else
        *((_QWORD *)Prcb + 4062) += NetCycles;
    }
    if( *((_QWORD *)Thread + 45) )
      KiEndCounterAccumulation((__int64)Thread);
  }
}

Referenced by:

KeQueryTotalCycleTimeThread
KiEndThreadCycleAccumulation
KiHvInterruptSubDispatch
KiInterruptSubDispatch
KiInterruptSubDispatchNoLock
KiInterruptSubDispatchNoLockNoEtw
KiIpiInterruptSubDispatch
KiScanInterruptObjectList
KiSpuriousDispatchNoEOI
KiSwInterrupt
KiUpdateTotalCyclesCurrentThread
KiVmbusInterruptSubDispatch
KxDispatchInterrupt
KxIsrLinkage