KiSetSystemTimeDpc

VOID __stdcall KiSetSystemTimeDpc(_KDPC *Dpc, VOID *DeferredContext, VOID *SystemArgument1, VOID *SystemArgument2){
  signed __int32 v7; 
  unsigned int v8; 
  struct _KPRCB *CurrentPrcb; 
  _KTIMER_TABLE *v10; 
  signed __int32 v11; 
  unsigned int v12; 
  signed __int32 v13; 
  unsigned int v14; 
  unsigned int v15; 
  __int64 v16; 
  _QWORD *v17; 
  UINT64 v18; 
  __int64 v19; 
  __int64 v20[2]; 
  UINT64 SpinCount; 
  UINT64 v22; 

  LODWORD(SpinCount) = 0;
  v7 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
  v8 = ~v7 & 0x80000000;
  if( (v7 & 0x7FFFFFFF) != 0 )
  {
    while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v8 )
      KeYieldProcessorEx(&SpinCount);
  }
  else
  {
    *(_DWORD *)SystemArgument2 = v8 | *((_DWORD *)SystemArgument2 + 1);
  }
  CurrentPrcb = KeGetCurrentPrcb();
  v10 = KiSelectActiveTimerTable(CurrentPrcb, 1u);
  if( CurrentPrcb->ClockOwner )
  {
    **((_QWORD **)DeferredContext + 2) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    v15 = *((_DWORD *)DeferredContext + 1);
    v16 = **((_QWORD **)DeferredContext + 1);
    v17 = (_QWORD *)*((_QWORD *)DeferredContext + 2);
    *((_QWORD *)DeferredContext + 3) = v16;
    v18 = v16 - *v17;
    *((_QWORD *)DeferredContext + 3) = v18;
    if( (v15 & 1) != 0 )
    {
      if( KeAdjustInterruptTime(v18, (v15 & 2) != 0) )
      {
        v19 = -*((_QWORD *)DeferredContext + 3);
        *(_BYTE *)DeferredContext = 1;
        *((_QWORD *)DeferredContext + 3) = v19;
      }
    }
    else
    {
      KiUpdateSystemTime(v18, 0i64, v15);
    }
  }
  LODWORD(v22) = 0;
  v11 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
  v12 = ~v11 & 0x80000000;
  if( (v11 & 0x7FFFFFFF) != 0 )
  {
    while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v12 )
      KeYieldProcessorEx(&v22);
  }
  else
  {
    *(_DWORD *)SystemArgument2 = v12 | *((_DWORD *)SystemArgument2 + 1);
  }
  if( *((_QWORD *)DeferredContext + 3) )
  {
    if( v10 )
      KiAdjustTimerDueTimes(CurrentPrcb, v10, (_KI_TIME_ADJUST_CONTEXT *)DeferredContext);
    v13 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
    v14 = ~v13 & 0x80000000;
    if( (v13 & 0x7FFFFFFF) != 0 )
    {
      LODWORD(v20[0]) = 0;
      while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v14 )
        KeYieldProcessorEx((UINT64 *)v20);
    }
    else
    {
      *(_DWORD *)SystemArgument2 = v14 | *((_DWORD *)SystemArgument2 + 1);
    }
  }
  _InterlockedDecrement((volatile signed __int32 *)SystemArgument1);
  KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, 2u);
}

Referenced by:

No references.