ExpCancelTimer
INT64 __fastcall ExpCancelTimer(KTIMER *Timer){
unsigned int v1;
unsigned __int8 CurrentIrql;
INT64 result;
__int64 v5;
__int64 v6;
KTIMER **v7;
v1 = 0;
if( (*((_BYTE *)Timer + 304) & 1) != 0 )
{
v5 = *((_QWORD *)Timer + 10);
KxAcquireSpinLock((UINT64 *)(v5 + 1120));
v6 = *((_QWORD *)Timer + 28);
v7 = (KTIMER **)*((_QWORD *)Timer + 29);
if( *(KTIMER **)(v6 + 8) != (KTIMER *)((char *)Timer + 224) || *v7 != (KTIMER *)((char *)Timer + 224) )
__fastfail(3u);
*v7 = (KTIMER *)v6;
*(_QWORD *)(v6 + 8) = v7;
KxReleaseSpinLock((UINT64 *)(v5 + 1120));
*((_BYTE *)Timer + 304) &= ~1u;
if( (*((_BYTE *)Timer + 304) & 2) != 0 && *((_BYTE *)Timer + 248)
|| KeCancelTimer(Timer)
|| KeRemoveQueueDpcEx((_KDPC *)((char *)Timer + 160), 0) )
{
v1 = 1;
}
if( KeRemoveQueueApc((_KAPC *)((char *)Timer + 72)) )
++v1;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiCancelTimer(Timer, 1u);
__writecr8(CurrentIrql);
}
result = v1;
*((_BYTE *)Timer + 248) = 0;
return result;
}Referenced by:
ExTimerRundown
NtCancelTimer