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.