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