ExpCancelTimer
UINT64 __stdcall ExpCancelTimer(_ETIMER *Timer){
unsigned int v1;
unsigned __int8 CurrentIrql;
UINT64 result;
_ETHREAD *Thread;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
char v8;
v1 = 0;
if( (Timer->CoalescingWindow & 1) != 0 )
{
Thread = Timer->TimerApc.Thread;
KxAcquireSpinLock(&Thread->ActiveTimerListLock);
Flink = Timer->ActiveTimerListEntry.Flink;
Blink = Timer->ActiveTimerListEntry.Blink;
if( Flink->Blink != &Timer->ActiveTimerListEntry || Blink->Flink != &Timer->ActiveTimerListEntry )
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
KxReleaseSpinLock(&Thread->ActiveTimerListLock);
LOBYTE(Timer->CoalescingWindow) &= ~1u;
if( (Timer->CoalescingWindow & 2) != 0 && LOBYTE(Timer->WakeReason)
|| (unsigned __int8)KeCancelTimer((INT64)Timer)
|| (KeRemoveQueueDpcEx(&Timer->TimerDpc, 0i64), v8) )
{
v1 = 1;
}
if( KeRemoveQueueApc((INT64)&Timer->TimerApc) )
++v1;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiCancelTimer(&Timer->KeTimer, 1u);
__writecr8(CurrentIrql);
}
result = v1;
LOBYTE(Timer->WakeReason) = 0;
return result;
}Referenced by:
ExTimerRundown
NtCancelTimer