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