KiSetClockTickRate
UINT64 __stdcall KiSetClockTickRate(UINT64 DesiredIncrement){
char v1;
int v2;
char v3;
unsigned int v4;
int v5;
__int64 v6;
__int64 *v7;
int v8;
UINT64 result;
__int64 v10;
__int64 v11;
v2 = KiClockState;
v10 = 0i64;
v3 = v1;
v4 = DesiredIncrement;
v11 = (unsigned int)DesiredIncrement;
LODWORD(KiLastRequestedTimeIncrement) = DesiredIncrement;
if( v1 )
{
((void(__fastcall *)(__int64, _QWORD, __int64 *))off_140C00890[0])(1i64, (unsigned int)DesiredIncrement, &v10);
v5 = 1;
}
else
{
((void(__fastcall *)(_QWORD, _QWORD, __int64 *))off_140C00890[0])(0i64, (unsigned int)DesiredIncrement, &v10);
v5 = 0;
}
KiClockOwnerOneShotRequestState = v5;
KiSetPendingTick(1u);
if( v2 == 2 )
_InterlockedExchange(&KiClockState, 0);
KiEventClockStateChange();
KeTimeIncrement = v10;
v6 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
KiClockTimerNextTickTime = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + (unsigned int)v10;
if( (unsigned int)v10 < dword_140C31374 )
dword_140C31374 = v10;
if( (unsigned int)v10 > dword_140C31370 )
dword_140C31370 = v10;
if( v4 < dword_140C3137C )
dword_140C3137C = v4;
if( v4 > dword_140C31378 )
dword_140C31378 = v4;
v7 = &KiClockIncrementTrace[4 * (unsigned int)KiClockIncrementTraceCount];
KiClockIncrementTraceCount = ((_BYTE)KiClockIncrementTraceCount + 1) & 0xF;
v8 = KiLastRequestedTimeIncrement;
*(_DWORD *)v7 = v10;
*((_DWORD *)v7 + 1) = v8;
v7[1] = v6;
v7[2] = KeQueryPerformanceCounter(0i64).QuadPart;
result = (unsigned int)KeTimeIncrement;
*((_BYTE *)v7 + 24) = v3;
return result;
}Referenced by:
KiSetClockIntervalToMinimumRequested