KiCalibrateTimeAdjustment

void __fastcall KiCalibrateTimeAdjustment(ULONG_PTR Argument){
  struct _KPRCB *CurrentPrcb; 
  unsigned int v3; 
  char v4; 
  INT64 v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  LARGE_INTEGER v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  volatile unsigned __int64 v11; 
  unsigned __int64 v12; 
  INT64 *v13; 
  unsigned __int64 v14; 
  LARGE_INTEGER PerformanceCounter; 
  UINT64 Flag; 
  unsigned __int64 v17; 
  union _LARGE_INTEGER PerformanceFrequency; 
  __int64 v19; 
  LARGE_INTEGER v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  EVENT_DATA_DESCRIPTOR EventData; 
  unsigned int v24; 
  v20.QuadPart = 0i64;
  CurrentPrcb = KeGetCurrentPrcb();
  PerformanceFrequency.QuadPart = 0i64;
  if( *((_DWORD *)CurrentPrcb + 9) == *(_DWORD *)(Argument + 4) )
  {
    _disable();
    v6 = *(_QWORD *)(Argument + 8);
    v3 = v24 >> 9;
    v19 = v6;
    v7 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
    v21 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
    v8 = KeQueryPerformanceCounter(&PerformanceFrequency);
    if( *(_BYTE *)Argument )
    {
      LODWORD(v17) = (__PAIR64__(HIDWORD(v19), v6) * PerformanceFrequency.QuadPart) >> 32;
      HIDWORD(v17) = PerformanceFrequency.HighPart * HIDWORD(v19)
                   + (((((unsigned int)v6 * (unsigned __int64)PerformanceFrequency.LowPart) >> 32)
                     + PerformanceFrequency.LowPart * (unsigned __int64)HIDWORD(v19)
                     + (unsigned int)v6 * (unsigned __int64)(unsigned int)PerformanceFrequency.HighPart) >> 32);
      v9 = v17;
      LODWORD(v17) = v6 * PerformanceFrequency.LowPart;
      *(_DWORD *)(Argument + 20) = v9 / 0x989680;
      HIDWORD(v17) = v9 % 0x989680;
      *(_DWORD *)(Argument + 16) = v17 / 0x989680;
      *(_QWORD *)(Argument + 16) += v8.QuadPart;
    }
    v22 = v7 / KeMaximumIncrement;
    v10 = *(_QWORD *)(Argument + 8);
    KiTickOffset = KeMaximumIncrement - v7 % KeMaximumIncrement;
    KUSER_SHARED_DATA.InterruptTimeBias += v10;
    LODWORD(v19) = v7 % KeMaximumIncrement;
    if( (KUSER_SHARED_DATA.InterruptTimeBias & 0x8000000000000000ui64) != 0i64 )
      __fastfail(5u);
    RtlWriteAcquireTickLock((INT64 *)&KUSER_SHARED_DATA.TimeUpdateLock);
    KUSER_SHARED_DATA.InterruptTime.High2Time = HIDWORD(v21);
    *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart = v7;
    KUSER_SHARED_DATA.TickCount.High2Time = HIDWORD(v22);
    KUSER_SHARED_DATA.TickCountQuad = v11;
    KUSER_SHARED_DATA.BaselineInterruptTimeQpc = v12;
    KiInterruptTimeErrorAccumulator = 0i64;
    RtlWriteReleaseTickLock(v13);
    *(_DWORD *)(Argument + 28) = 0;
  }
  else
  {
    _disable();
    v3 = v24 >> 9;
    do
      KiPollFreezeExecution();
    while( *(_DWORD *)(Argument + 28) );
  }
  v4 = v3 & 1;
  if( KiSelectActiveTimerTable((INT64)CurrentPrcb, 1) )
  {
    v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
    KeRemoveQueueDpc((_KDPC *)((char *)CurrentPrcb + 31792));
    KeInsertQueueDpc((PRKDPC)((char *)CurrentPrcb + 31792), (PVOID)((unsigned int)(v14 >> 18) - 256), 0i64);
  }
  *((_DWORD *)CurrentPrcb + 3149) = KUSER_SHARED_DATA.TickCount.LowPart;
  v5 = *(_QWORD *)(Argument + 8);
  if( *(_BYTE *)Argument )
  {
    HalCalibratePerformanceCounter((INT64 *)(Argument + 24), *(_QWORD *)(Argument + 16));
    KeRebaselineInterruptTime();
    if( (*(_WORD *)(&PerfGlobalGroupMask + 2) & 0x8000) != 0 )
    {
      PerformanceCounter = KeQueryPerformanceCounter(0i64);
      EventData.Reserved = 0;
      v20 = PerformanceCounter;
      EventData.Size = 8;
      EventData.Ptr = (unsigned __int64)&v20;
      LODWORD(Flag) = 4200450;
      EtwTraceKernelEvent(&EventData, 1ui64, 0x80008000ui64, 0x1232u, Flag);
    }
  }
  if( *((_BYTE *)CurrentPrcb + 33) )
    KiUpdateSystemTime(v5, 0i64, 3);
  if( v4 )
    _enable();
}

Referenced by:

No references.