KiCancelTimer
UINT8 __stdcall KiCancelTimer(_KTIMER *Timer, UINT8 ReleaseTimer){
UINT8 v2;
UINT8 v3;
__int64 Processor;
__int64 v6;
struct _KPRCB *CurrentPrcb;
__int64 v8;
_KTIMER_TABLE *p_TimerTable;
volatile signed __int32 *v10;
unsigned __int16 TimerType;
_LIST_ENTRY *Flink;
unsigned __int64 v13;
_LIST_ENTRY *Blink;
__int64 v15;
unsigned int v16;
int v17;
volatile signed __int32 *v19;
unsigned __int64 v20;
__int64 v21;
_DWORD *SchedulerAssist;
struct _KPRCB *v23;
_DWORD *v24;
int v25;
UINT64 SpinCount;
UINT64 v28;
UINT64 v29;
INT64 v30;
INT64 v31;
__int64 v32;
v32 = 0i64;
v2 = 0;
LODWORD(SpinCount) = 0;
v3 = ReleaseTimer;
while( 1 )
{
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset((volatile signed __int32 *)Timer, 7u) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( (*(_DWORD *)Timer->gap0 & 0x80u) != 0 );
}
if( (Timer->gap0[3] & 0xC0) == 0 )
break;
Processor = Timer->Processor;
v6 = (unsigned __int8)Timer->gap0[2];
CurrentPrcb = KeGetCurrentPrcb();
v8 = v6;
LODWORD(v28) = 0;
p_TimerTable = &(*(&KiProcessorBlock + Processor))->TimerTable;
v10 = (volatile signed __int32 *)&p_TimerTable->TimerEntries[(unsigned __int64)Timer->TimerType][v6];
while( _interlockedbittestandset64(v10, 0i64) )
{
do
KeYieldProcessorEx(&v28);
while( *(_QWORD *)v10 );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
if( (char)Timer->gap0[3] >= 0 )
{
TimerType = Timer->TimerType;
Flink = Timer->TimerListEntry.Flink;
v13 = 4 * (((unsigned __int64)TimerType << 8) + v8 + 16);
Blink = Timer->TimerListEntry.Blink;
v15 = 4 * (((TimerType ^ 1i64) << 8) + v8 + 16);
if( Flink->Blink != &Timer->TimerListEntry || Blink->Flink != &Timer->TimerListEntry )
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
if( Blink != Flink )
{
LABEL_10:
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
v16 = -1073741953;
v17 = -1073741825;
LABEL_11:
if( !v3 )
v16 = v17;
_InterlockedAnd((volatile signed __int32 *)Timer, v16);
return 1;
}
HIDWORD(p_TimerTable->TimerExpiry[v13 + 3]) = -1;
if( TimerType )
{
v19 = (volatile signed __int32 *)p_TimerTable->TimerEntries + 8 * v8;
v31 = (INT64)v19;
v30 = (INT64)KeGetCurrentPrcb();
if( _interlockedbittestandset64(v19, 0i64) )
{
_mm_pause();
v19 = 0i64;
}
if( v19 )
goto LABEL_19;
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
v23 = KeGetCurrentPrcb();
v19 = (volatile signed __int32 *)v31;
LODWORD(v29) = 0;
while( _interlockedbittestandset64(v19, 0i64) )
{
do
KeYieldProcessorEx(&v29);
while( *(_QWORD *)v19 );
v24 = v23->SchedulerAssist;
if( v24 && v23->NestingLevel <= 1u )
{
v25 = v24[6] + 1;
v24[6] = v25;
}
}
v10 = (volatile signed __int32 *)&p_TimerTable->TimerEntries[1][v8];
v31 = (INT64)KeGetCurrentPrcb();
HIDWORD(v29) = 0;
while( _interlockedbittestandset64(v10, 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&v29 + 4));
while( *(_QWORD *)v10 );
}
}
else
{
v19 = (volatile signed __int32 *)&p_TimerTable->TimerEntries[1][v8];
v30 = (INT64)KeGetCurrentPrcb();
HIDWORD(v28) = 0;
while( _interlockedbittestandset64(v19, 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&v28 + 4));
while( *(_QWORD *)v19 );
}
}
v3 = ReleaseTimer;
LABEL_19:
if( HIDWORD(p_TimerTable->TimerExpiry[v13 + 3]) == -1 && HIDWORD(p_TimerTable->TimerExpiry[v15 + 3]) == -1 )
{
if( KiSerializeTimerExpiration )
{
v20 = v8 & 0x3F;
v21 = 8i64 * ((unsigned int)v8 >> 6);
}
else
{
v20 = BYTE1(p_TimerTable[-1].TimerEntries[0][61].Entry.Flink);
v21 = v8 << 6;
}
_interlockedbittestandreset64(
(volatile signed __int32 *)(qword_140CFC7A8[2 * LOBYTE(p_TimerTable[-1].TimerEntries[0][61].Entry.Flink)] + v21),
v20);
}
_InterlockedAnd64((volatile signed __int64 *)v19, 0i64);
goto LABEL_10;
}
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
if( _InterlockedExchange64((volatile __int64 *)&p_TimerTable->TimerExpiry[Timer->gap0[3] & 0x3F], 0i64) )
{
v16 = 16777087;
v17 = 0xFFFFFF;
goto LABEL_11;
}
_InterlockedAnd((volatile signed __int32 *)Timer, 0xFFFFFF7F);
LODWORD(SpinCount) = 0;
while( (char)Timer->gap0[3] < 0 )
KeYieldProcessorEx(&SpinCount);
}
if( v3 )
_InterlockedAnd((volatile signed __int32 *)Timer, 0xFFFFFF7F);
return v2;
}Referenced by:
ExpCancelTimer
KeCancelTimer
KeCancelTimerInternal
KeSetTimerEx
KiSetTimerEx
KiSuspendThread
KiSwapThread