KeResumeClockTimerFromIdle

VOID __stdcall KeResumeClockTimerFromIdle(UINT64 *ClockTimerLatency){
  struct _KPRCB *CurrentPrcb; 
  char v3; 
  signed __int32 v4; 
  __int64 v5; 
  char v6; 
  volatile signed __int32 *v7; 
  struct _KPRCB *v8; 
  _BYTE *v9; 
  char v10; 
  __int64 v11; 
  int v12; 
  __int32 v13; 
  _BOOL8 v14; 
  BYTE v15; 
  char v16[7]; 
  UINT64 NewInterruptTime; 
  _QWORD a2[2]; 
  UINT64 CurrentTick; 
  int v20; 
  a2[1] = 0i64;
  NewInterruptTime = 0i64;
  a2[0] = 0i64;
  CurrentTick = 0i64;
  v16[0] = 0;
  v15 = 0;
  if( (_BYTE)KiDynamicTickDisableReason )
    return;
  CurrentPrcb = KeGetCurrentPrcb();
  v3 = 0;
  if( ClockTimerLatency )
    *(_DWORD *)ClockTimerLatency = -1;
  while( 1 )
  {
    v4 = KiClockState;
    if( KiClockState == 1 )
    {
      v4 = _InterlockedCompareExchange(&KiClockState, 3, 1);
      if( v4 == 1 )
        break;
    }
    if( v4 != 3 )
      goto LABEL_6;
    _mm_pause();
  }
  KiUpdateTimeAssist(0i64, &NewInterruptTime, &CurrentTick);
  KiClockTimerOneShotEndTime = NewInterruptTime;
  if( KeMinimumIncrement - 1 + (int)NewInterruptTime - (int)KiLastNonHrTimerExpiration >= (unsigned int)KeNonHrTimeIncrement )
    KiLastNonHrTimerExpiration = (PVOID)NewInterruptTime;
  v9 = (_BYTE *)NewInterruptTime;
  if( (int)NewInterruptTime - (int)KiLastPseudoHrTimerExpiration + KeMinimumIncrement - 1 >= (unsigned int)KePseudoHrTimeIncrement )
    KiLastPseudoHrTimerExpiration = NewInterruptTime;
  v10 = off_140C00898[0]();
  if( KiClockLatencyMeasurementEnabled )
  {
    if( ClockTimerLatency
      && (_DWORD)KiClockTimerOwner == *((_DWORD *)CurrentPrcb + 9)
      && (unsigned __int64)v9 >= KiClockTimerNextTickTime
      && v10 )
    {
      *(_DWORD *)ClockTimerLatency = (_DWORD)v9 - KiClockTimerNextTickTime;
    }
    KiClockLatencyMeasurementEnabled = 0;
  }
  if( ClockTimerLatency
    && (_DWORD)KiClockTimerOwner == *((_DWORD *)CurrentPrcb + 9)
    && (unsigned __int64)v9 >= KiClockTimerNextTickTime
    && (unsigned __int8)off_140C00898[0]() )
  {
    *(_DWORD *)ClockTimerLatency = (_DWORD)v9 - KiClockTimerNextTickTime;
  }
  KiClockLatencyMeasurementEnabled = 0;
  if( (unsigned __int64)&v9[-KiClockTimerOneShotStartTime] < qword_140C31368 )
    qword_140C31368 = (__int64)&v9[-KiClockTimerOneShotStartTime];
  if( (unsigned __int64)&v9[-KiClockTimerOneShotStartTime] > qword_140C31360 )
    qword_140C31360 = (__int64)&v9[-KiClockTimerOneShotStartTime];
  if( KiConsiderTimerRebasing )
  {
    if( v10 && (unsigned int)KiGetPastDueIRTimerInfo((UINT64)v9, (BYTE *)v16, &v15) )
      ExRecordOneTimerExpiry(v16[0], v15);
    KiAdjustTimersAfterDripsExit(CurrentPrcb, v9);
    KiConsiderTimerRebasing = 0;
  }
  if( KiClockTimerPerCpu )
  {
    KeQuerySystemAllowedCpuSetAffinity(&KiClockOwnerAllowedCpuSet, &KiClockOwnerAllowedCpuSetVersion);
    v11 = *((unsigned int *)CurrentPrcb + 9);
    if( ((KiClockOwnerAllowedCpuSet.Bitmap[(unsigned int)KiProcessorIndexToNumberMappingTable[v11] >> 6] >> (KiProcessorIndexToNumberMappingTable[v11] & 0x3F)) & 1) == 0 )
    {
      LODWORD(v11) = KeFindFirstSetRightAffinityEx(&KiIntSteerMask);
      if( (_DWORD)v11 == -1 )
        LODWORD(v11) = *((_DWORD *)CurrentPrcb + 9);
    }
    v12 = *((_DWORD *)CurrentPrcb + 9);
  }
  else
  {
    LODWORD(v11) = *((_DWORD *)CurrentPrcb + 9);
    v12 = v11;
  }
  if( v12 == (_DWORD)v11 )
  {
    if( (unsigned __int64)&v9[(unsigned int)KiLastRequestedTimeIncrement] <= KiClockTimerNextTickTime )
    {
      if( KiClockTimerPerCpu )
      {
        *((_BYTE *)CurrentPrcb + 33) = 1;
        LODWORD(KiClockTimerOwner) = v12;
        if( !KiGetPendingTick() )
          off_140C00880[0]();
      }
      v13 = 0;
      KiRestoreClockTickRate((INT64)v9, a2);
      KiClockTimerNextTickTime = (__int64)&v9[KeTimeIncrement];
      KiEventClockStateChange();
      goto LABEL_42;
    }
  }
  else
  {
    v3 = 1;
  }
  ++qword_140C31358;
  v13 = 2;
  KiEventClockStateChange();
  if( v3 )
  {
    LODWORD(KiClockTimerOwner) = v11;
    KiSendClockInterruptToClockOwner();
  }
LABEL_42:
  if( KiForceIdleReset )
  {
    KiForceIdleReset = 0;
    v14 = (unsigned __int8)off_140C00898[0]() == 0;
    KiResetForceIdle(v14, 0);
  }
  v20 = 0;
  _InterlockedExchange(&KiClockState, v13);
LABEL_6:
  v5 = *((unsigned int *)CurrentPrcb + 9);
  if( (_DWORD)KiClockTimerOwner == (_DWORD)v5 && !*((_BYTE *)CurrentPrcb + 33) )
    *((_BYTE *)CurrentPrcb + 33) = 1;
  v6 = *((_BYTE *)CurrentPrcb + 33);
  if( !v6 )
  {
    v7 = (volatile signed __int32 *)*((_QWORD *)*(&KiProcessorBlock + v5) + 4247);
    v6 = 0;
    if( v7 )
    {
      if( (KiVelocityFlags & 0x40) != 0 )
      {
        _InterlockedAnd(v7, 0xFFF7FFFF);
        v6 = *((_BYTE *)CurrentPrcb + 33);
      }
    }
  }
  if( v6 )
  {
    v8 = KiClockTimerPerCpu ? KeGetCurrentPrcb() : *(&KiProcessorBlock + (unsigned int)KiClockTimerOwner);
    if( (*((_BYTE *)v8 + 34) & 1) == 0 )
    {
      off_140C00880[0]();
      v6 = *((_BYTE *)CurrentPrcb + 33);
    }
  }
  if( !v6 && (*((_BYTE *)CurrentPrcb + 34) & 1) != 0 )
  {
    off_140C00888[0]();
    KiSetPendingTick(0);
  }
}

Referenced by:

PpmIdleExecuteTransition