KiRemoveEntryTimer
VOID __fastcall KiRemoveEntryTimer(_KTIMER_TABLE *TimerTable, _KTIMER *Timer, UINT64 Hand){
volatile signed __int64 **v3;
__int64 v4;
unsigned int TimerType;
_LIST_ENTRY *Flink;
_LIST_ENTRY *p_TimerListEntry;
unsigned __int64 v9;
_LIST_ENTRY *Blink;
__int64 v11;
volatile signed __int32 *v12;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v14;
unsigned __int64 v15;
struct _KPRCB *v16;
_DWORD *v17;
struct _KPRCB *v18;
struct _KPRCB *v19;
volatile signed __int32 *v20;
_DWORD *SchedulerAssist;
int v22;
_DWORD *v23;
int v24;
UINT64 v25;
UINT64 v26;
UINT64 SpinCount;
volatile signed __int64 **v28;
v28 = v3;
v4 = (unsigned int)Hand;
TimerType = Timer->TimerType;
Flink = Timer->TimerListEntry.Flink;
p_TimerListEntry = &Timer->TimerListEntry;
v9 = 4 * (((unsigned __int64)TimerType << 8) + v4 + 16);
Blink = p_TimerListEntry->Blink;
v11 = 4 * (((TimerType ^ 1i64) << 8) + v4 + 16);
if( Flink->Blink != p_TimerListEntry || Blink->Flink != p_TimerListEntry )
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
if( Blink == Flink )
{
HIDWORD(TimerTable->TimerExpiry[v9 + 3]) = -1;
if( (_WORD)TimerType )
{
v12 = (volatile signed __int32 *)TimerTable->TimerEntries + 8 * v4;
CurrentPrcb = KeGetCurrentPrcb();
if( CurrentPrcb->SchedulerAssist && CurrentPrcb->NestingLevel <= 1u && CurrentPrcb->NestingLevel == 1 )
v3 = v28;
if( _interlockedbittestandset64((volatile signed __int32 *)TimerTable->TimerEntries + 8 * v4, 0i64) )
{
if( CurrentPrcb->SchedulerAssist && CurrentPrcb->NestingLevel <= 1u && !(_DWORD)Blink )
v3 = v28;
_mm_pause();
v12 = 0i64;
}
if( !v12 )
{
_InterlockedAnd64(*v3, 0i64);
v12 = (volatile signed __int32 *)TimerTable->TimerEntries + 8 * v4;
v18 = KeGetCurrentPrcb();
LODWORD(v25) = 0;
while( _interlockedbittestandset64(v12, 0i64) )
{
do
KeYieldProcessorEx(&v25);
while( *(_QWORD *)v12 );
SchedulerAssist = v18->SchedulerAssist;
if( SchedulerAssist && v18->NestingLevel <= 1u )
{
v22 = SchedulerAssist[6] + 1;
SchedulerAssist[6] = v22;
}
}
v19 = KeGetCurrentPrcb();
v20 = (volatile signed __int32 *)&TimerTable->TimerEntries[1][v4];
LODWORD(v26) = 0;
while( _interlockedbittestandset64(v20, 0i64) )
{
do
KeYieldProcessorEx(&v26);
while( *(_QWORD *)v20 );
v23 = v19->SchedulerAssist;
if( v23 && v19->NestingLevel <= 1u )
{
v24 = v23[6] + 1;
v23[6] = v24;
}
}
*v28 = (volatile signed __int64 *)v20;
}
}
else
{
v16 = KeGetCurrentPrcb();
v12 = (volatile signed __int32 *)&TimerTable->TimerEntries[1][v4];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64(v12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)v12 );
v17 = v16->SchedulerAssist;
if( v17 && v16->NestingLevel <= 1u )
++v17[6];
}
}
if( HIDWORD(TimerTable->TimerExpiry[v9 + 3]) == -1 && HIDWORD(TimerTable->TimerExpiry[v11 + 3]) == -1 )
{
if( KiSerializeTimerExpiration )
{
v14 = v4 & 0x3F;
v15 = 8i64 * ((unsigned int)v4 >> 6);
}
else
{
v14 = BYTE1(TimerTable[-1].TimerEntries[0][61].Entry.Flink);
v15 = (unsigned __int64)(unsigned int)v4 << 6;
}
_interlockedbittestandreset64(
(volatile signed __int32 *)(qword_140CFC7A8[2 * LOBYTE(TimerTable[-1].TimerEntries[0][61].Entry.Flink)] + v15),
v14);
}
_InterlockedAnd64((volatile signed __int64 *)v12, 0i64);
}
}Referenced by:
ExpSetTimerObject
KiAdjustTimerDueTimes
KiExpireTimerTable
KiInsertTimerTable
KiRetireDpcList