KeSetTimer2
UINT8 __stdcall KeSetTimer2(_KTIMER2 *Timer, INT64 DueTime, INT64 Period, _EXT_SET_PARAMETERS_V0 *Parameters){
__int64 v5;
INT64 v6;
unsigned __int8 TypeFlags;
unsigned __int8 v9;
unsigned __int64 v10;
UINT64 v11;
unsigned __int64 v12;
__int64 NoWakeTolerance;
UINT8 v14;
int v15;
CHAR v16;
char v17;
unsigned __int8 Signalling;
bool v19;
unsigned __int8 v20;
int LockNV;
signed __int32 v22;
CHAR v23;
INT64 v24;
INT64 SystemTimePrecise;
INT64 v27;
char v28;
signed __int32 v29;
UINT8 WasLate;
__int64 CurrentIrql;
INT64 CurrentQpc;
CurrentQpc = 0i64;
v5 = Period;
v6 = DueTime;
if( Period && Period < (unsigned int)KeMinimumIncrement )
v5 = (unsigned int)KeMinimumIncrement;
TypeFlags = Timer->TypeFlags;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v9 = 0;
if( DueTime > 0 )
{
v9 = 1;
if( (TypeFlags & 4) != 0 )
SystemTimePrecise = RtlGetSystemTimePrecise();
else
SystemTimePrecise = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
v27 = 0i64;
if( v6 > SystemTimePrecise )
v27 = SystemTimePrecise - v6;
v6 = v27;
}
if( (TypeFlags & 4) != 0 )
LODWORD(v10) = RtlGetInterruptTimePrecise(&CurrentQpc);
else
v10 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
v11 = v10 - v6;
if( v10 - v6 < v10 || v11 == -1i64 )
v11 = -2i64;
v12 = v11;
if( Parameters && Timer->CollectionIndex[0] != 21 )
{
NoWakeTolerance = Parameters->NoWakeTolerance;
if( NoWakeTolerance == -1 )
{
v12 = -1i64;
}
else
{
v12 = NoWakeTolerance + v11;
if( NoWakeTolerance + v11 < v11 || v12 == -1i64 )
v12 = -2i64;
}
}
v14 = 0;
WasLate = 0;
v15 = 1;
if( !KiAcquireTimer2LockUnlessDisabled(Timer) )
{
KiAcquireTimer2CollectionLockIfInserted(Timer, v16);
if( v17 )
{
KiRemoveTimer2(Timer);
KxReleaseSpinLock(&KiTimer2CollectionLock);
v14 = 1;
}
else
{
Signalling = Timer->Header.Signalling;
if( (Signalling & 0xF) != 0 )
{
v15 = 8;
if( (Signalling & 4) == 0 )
v14 = 1;
}
}
v19 = (KiVelocityFlags & 0x2000) == 0;
Timer->DueTime[0] = v11;
Timer->DueTime[1] = v12;
v20 = Timer->TypeFlags;
Timer->Header.SignalState = 0;
Timer->Period = v5;
Timer->AbsoluteSystemTime = v9;
if( v19 )
{
if( (v20 & 0x10) == 0 )
{
LABEL_43:
Timer->TypeFlags = v20 | 0x10;
KiUpdateTimer2Collections((BYTE *)Timer);
}
}
else if( (v20 & 0xE) == 0 )
{
if( !PsTimerResolutionActive(*((_QWORD *)KeGetCurrentThread() + 23)) )
{
if( v28 )
{
Timer->TypeFlags = v20 & 0xEF;
KiUpdateTimer2Collections((BYTE *)Timer);
}
goto LABEL_17;
}
if( !v28 )
goto LABEL_43;
}
LABEL_17:
if( v15 == 1 )
{
KxAcquireSpinLock(&KiTimer2CollectionLock);
KiInsertTimer2WithCollectionLockHeld(Timer, 1u, &WasLate);
}
LockNV = Timer->Header.LockNV;
v22 = _InterlockedCompareExchange(
&Timer->Header.Lock,
(v15 << 8) | Timer->Header.LockNV & 0xFFFFF07F,
Timer->Header.LockNV);
if( LockNV != v22 )
{
do
{
v29 = v22;
v22 = _InterlockedCompareExchange(&Timer->Header.Lock, (v15 << 8) | v22 & 0xFFFFF07F, v22);
}
while( v29 != v22 );
}
if( v15 == 1 )
KxReleaseSpinLock(&KiTimer2CollectionLock);
if( !KeIsForceIdleEngaged() )
{
if( WasLate )
{
KiRequestTimer2Expiration(v24, v23);
}
else if( (TypeFlags & 4) != 0
&& KiShouldActivateHRTimerClock(*(UINT64 *)&KUSER_SHARED_DATA.InterruptTime.LowPart, v11) )
{
KiSendClockInterruptToClockOwner();
}
}
}
__writecr8((unsigned __int8)CurrentIrql);
return v14;
}Referenced by:
EtwpCoverageEnsureContext
EtwpCoverageRecord
EtwpEnableKernelTrace
ExInitializeTimeRefresh
ExSetTimer
ExpSetTimerObject2
ExpTimeRefreshWork
ExpWorkQueueManagerThread
HalpBlkInitSystem
KiTriggerForegroundBoostDpc
MiStoreEvictThread
NtCreateWorkerFactory
NtSetInformationWorkerFactory
PopCheckPowerSourceAfterRtcWakeSet
PopDirectedDripsStartDisengageTimer
PopDripsWatchdogScheduleNextTimer
PopIdleArmAoAcDozeS4Timer
PopNetArmDsEvaluationTimer
PopNetArmRefreshTimer
PopPowerAggregatorSessionSwitchWorker
PopPowerButtonWorkCallback
PopSleepstudyStartNextSession
PopThermalUpdateTelemetryClientCount
PopThermalWorker
PpmRegisterPerfStates
SMKM_STORE_MGR::SmHighMemPriorityTimerStart