ExpTimerPause
VOID __stdcall ExpTimerPause(_ETIMER *Timer, UINT64 SystemTime, UINT64 InterruptTime){
char v3;
char v4;
char CoalescingWindow;
char v9;
char v10;
UINT64 v11;
UINT64 v12;
_KDUE_TIME_TYPE *v13;
UINT64 *v14;
UINT64 DueTime;
INT64 a3;
DueTime = 0i64;
v4 = v3;
LODWORD(a3) = 0;
if( !v3 )
KxAcquireSpinLock(&Timer->Lock);
CoalescingWindow = Timer->CoalescingWindow;
if( (CoalescingWindow & 2) == 0 )
{
LOBYTE(Timer->CoalescingWindow) = CoalescingWindow | 2;
KeCancelTimerInternal((INT64)Timer, &DueTime, (INT64)&a3, (INT64)&Timer[1].KeTimer.gap0[8], v13, v14);
if( v9 )
{
v10 = a3;
switch( (_DWORD)a3 )
{
case 1:
if( DueTime <= InterruptTime )
{
*(_QWORD *)Timer[1].KeTimer.gap0 = 0i64;
break;
}
v12 = SystemTime + DueTime - InterruptTime;
goto LABEL_20;
case 2:
if( DueTime <= InterruptTime )
v11 = 0i64;
else
v11 = InterruptTime - DueTime;
*(_QWORD *)Timer[1].KeTimer.gap0 = v11;
break;
case 3:
v12 = DueTime;
LABEL_20:
*(_QWORD *)Timer[1].KeTimer.gap0 = v12;
break;
}
}
else
{
v10 = 0;
}
LOBYTE(Timer->WakeReason) = v10;
}
if( !v4 )
KxReleaseSpinLock(&Timer->Lock);
}Referenced by:
ExWakeTimersPause
PspSetProcessFreezeStateCallback