KiCalibrateTimeAdjustment

void __fastcall KiCalibrateTimeAdjustment(__int64 a1){
  struct _KPRCB *CurrentPrcb; 
  unsigned int v3; 
  char v4; 
  UINT64 v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  UINT64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  volatile unsigned __int64 v11; 
  unsigned __int64 v12; 
  __int64 *v13; 
  unsigned __int64 v14; 
  UINT64 PerformanceCounter; 
  unsigned __int64 v16; 
  _LARGE_INTEGER PerformanceFrequency; 
  __int64 v18; 
  UINT64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  __int64 *v22; 
  int v23; 
  int v24; 
  unsigned int v25; 

  v19 = 0i64;
  CurrentPrcb = KeGetCurrentPrcb();
  PerformanceFrequency.QuadPart = 0i64;
  if( CurrentPrcb->Number == *(_DWORD *)(a1 + 4) )
  {
    _disable();
    v6 = *(_QWORD *)(a1 + 8);
    v3 = v25 >> 9;
    v18 = v6;
    v7 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
    v20 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
    v8 = KeQueryPerformanceCounter(&PerformanceFrequency);
    if( *(_BYTE *)a1 )
    {
      LODWORD(v16) = (__PAIR64__(HIDWORD(v18), v6) * PerformanceFrequency.QuadPart) >> 32;
      HIDWORD(v16) = PerformanceFrequency.anonymous_0.HighPart * HIDWORD(v18)
                   + (((((unsigned int)v6 * (unsigned __int64)PerformanceFrequency.anonymous_0.LowPart) >> 32)
                     + PerformanceFrequency.anonymous_0.LowPart * (unsigned __int64)HIDWORD(v18)
                     + (unsigned int)v6 * (unsigned __int64)(unsigned int)PerformanceFrequency.anonymous_0.HighPart) >> 32);
      v9 = v16;
      LODWORD(v16) = v6 * PerformanceFrequency.anonymous_0.LowPart;
      *(_DWORD *)(a1 + 20) = v9 / 0x989680;
      HIDWORD(v16) = v9 % 0x989680;
      *(_DWORD *)(a1 + 16) = v16 / 0x989680;
      *(_QWORD *)(a1 + 16) += v8;
    }
    v21 = v7 / (unsigned int)KeMaximumIncrement;
    v10 = *(_QWORD *)(a1 + 8);
    KiTickOffset = KeMaximumIncrement - v7 % (unsigned int)KeMaximumIncrement;
    KUSER_SHARED_DATA.InterruptTimeBias += v10;
    LODWORD(v18) = v7 % (unsigned int)KeMaximumIncrement;
    if( (KUSER_SHARED_DATA.InterruptTimeBias & 0x8000000000000000ui64) != 0i64 )
      __fastfail(5u);
    RtlWriteAcquireTickLock((signed __int64 *)&KUSER_SHARED_DATA.TimeUpdateLock);
    KUSER_SHARED_DATA.InterruptTime.High2Time = HIDWORD(v20);
    *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart = v7;
    KUSER_SHARED_DATA.TickCount.High2Time = HIDWORD(v21);
    KUSER_SHARED_DATA.TickCountQuad = v11;
    KUSER_SHARED_DATA.BaselineInterruptTimeQpc = v12;
    qword_140C50398 = 0i64;
    RtlWriteReleaseTickLock(v13);
    *(_DWORD *)(a1 + 28) = 0;
  }
  else
  {
    _disable();
    v3 = v25 >> 9;
    do
      KiPollFreezeExecution();
    while( *(_DWORD *)(a1 + 28) );
  }
  v4 = v3 & 1;
  if( KiSelectActiveTimerTable(CurrentPrcb, 1u) )
  {
    v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
    KeRemoveQueueDpc(&CurrentPrcb->TimerExpirationDpc);
    KeInsertQueueDpc((UINT64)&CurrentPrcb->TimerExpirationDpc, (unsigned int)(v14 >> 18) - 256, 0i64);
  }
  CurrentPrcb->LastTick = KUSER_SHARED_DATA.TickCount.LowPart;
  v5 = *(_QWORD *)(a1 + 8);
  if( *(_BYTE *)a1 )
  {
    HalCalibratePerformanceCounter((INT32 *)(a1 + 24), *(_QWORD *)(a1 + 16));
    KeRebaselineInterruptTime();
    if( (xmmword_140CFB490 & 0x8000) != 0 )
    {
      PerformanceCounter = KeQueryPerformanceCounter(0i64);
      v24 = 0;
      v19 = PerformanceCounter;
      v23 = 8;
      v22 = (__int64 *)&v19;
      EtwTraceKernelEvent((__int64)&v22, 1u, 0x80008000, 0x1232u, 0x401802u);
    }
  }
  if( CurrentPrcb->ClockOwner )
    KiUpdateSystemTime(v5, 0i64, 3ui64);
  if( v4 )
    _enable();
}

Referenced by:

No references.