KiCancelTimer

UINT8 __stdcall KiCancelTimer(_KTIMER *Timer, UINT8 ReleaseTimer){
  UINT8 v2; 
  UINT8 v3; 
  __int64 v5; 
  __int64 v6; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v8; 
  char *v9; 
  volatile signed __int32 *v10; 
  unsigned __int16 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  _KTIMER **v14; 
  __int64 v15; 
  unsigned int v16; 
  int v17; 
  volatile signed __int32 *v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  struct _KPRCB *v23; 
  __int64 v24; 
  int v25; 
  UINT64 SpinCount; 
  int v28; 
  UINT64 v29; 
  UINT64 v30; 
  INT64 v31; 
  INT64 v32; 
  __int64 v33; 
  v33 = 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 & 0x80u) != 0 );
    }
    if( (*((_BYTE *)Timer + 3) & 0xC0) == 0 )
      break;
    v5 = *((unsigned __int16 *)Timer + 28);
    v6 = *((unsigned __int8 *)Timer + 2);
    CurrentPrcb = KeGetCurrentPrcb();
    v8 = v6;
    v28 = 0;
    v9 = (char *)*(&KiProcessorBlock + v5) + 14656;
    v10 = (volatile signed __int32 *)&v9[0x2000 * (unsigned __int64)*((unsigned __int16 *)Timer + 29) + 512 + 32 * v6];
    while( _interlockedbittestandset64(v10, 0i64) )
    {
      do
        KeYieldProcessorEx((UINT64 *)&v28);
      while( *(_QWORD *)v10 );
      v22 = *((_QWORD *)CurrentPrcb + 4247);
      if( v22 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
        ++*(_DWORD *)(v22 + 24);
    }
    if( *((char *)Timer + 3) >= 0 )
    {
      v11 = *((_WORD *)Timer + 29);
      v12 = *((_QWORD *)Timer + 4);
      v13 = 32 * (((unsigned __int64)v11 << 8) + v8 + 16);
      v14 = (_KTIMER **)*((_QWORD *)Timer + 5);
      v15 = 32 * (((v11 ^ 1i64) << 8) + v8 + 16);
      if( *(_KTIMER **)(v12 + 8) != (_KTIMER *)((char *)Timer + 32) || *v14 != (_KTIMER *)((char *)Timer + 32) )
        __fastfail(3u);
      *v14 = (_KTIMER *)v12;
      *(_QWORD *)(v12 + 8) = v14;
      if( v14 != (_KTIMER **)v12 )
      {
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;
      }
      *(_DWORD *)&v9[v13 + 28] = -1;
      if( v11 )
      {
        v19 = (volatile signed __int32 *)&v9[32 * v8 + 512];
        v32 = (INT64)v19;
        v31 = (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 *)v32;
        HIDWORD(v29) = 0;
        while( _interlockedbittestandset64(v19, 0i64) )
        {
          do
            KeYieldProcessorEx((UINT64 *)((char *)&v29 + 4));
          while( *(_QWORD *)v19 );
          v24 = *((_QWORD *)v23 + 4247);
          if( v24 && *((_BYTE *)v23 + 32) <= 1u )
          {
            v25 = *(_DWORD *)(v24 + 24) + 1;
            *(_DWORD *)(v24 + 24) = v25;
          }
        }
        v10 = (volatile signed __int32 *)&v9[32 * v8 + 8704];
        v32 = (INT64)KeGetCurrentPrcb();
        LODWORD(v30) = 0;
        while( _interlockedbittestandset64(v10, 0i64) )
        {
          do
            KeYieldProcessorEx(&v30);
          while( *(_QWORD *)v10 );
        }
      }
      else
      {
        v19 = (volatile signed __int32 *)&v9[32 * v8 + 8704];
        v31 = (INT64)KeGetCurrentPrcb();
        LODWORD(v29) = 0;
        while( _interlockedbittestandset64(v19, 0i64) )
        {
          do
            KeYieldProcessorEx(&v29);
          while( *(_QWORD *)v19 );
        }
      }
      v3 = ReleaseTimer;
LABEL_19:
      if( *(_DWORD *)&v9[v13 + 28] == -1 && *(_DWORD *)&v9[v15 + 28] == -1 )
      {
        if( KiSerializeTimerExpiration )
        {
          v20 = v8 & 0x3F;
          v21 = 8i64 * ((unsigned int)v8 >> 6);
        }
        else
        {
          v20 = (unsigned __int8)*(v9 - 14447);
          v21 = v8 << 6;
        }
        _interlockedbittestandreset64(
          (volatile signed __int32 *)(qword_140CFC7A8[2 * (unsigned __int8)*(v9 - 14448)] + v21),
          v20);
      }
      _InterlockedAnd64((volatile signed __int64 *)v19, 0i64);
      goto LABEL_10;
    }
    _InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
    if( _InterlockedExchange64((volatile __int64 *)&v9[8 * (*((_BYTE *)Timer + 3) & 0x3F)], 0i64) )
    {
      v16 = 16777087;
      v17 = 0xFFFFFF;
      goto LABEL_11;
    }
    _InterlockedAnd((volatile signed __int32 *)Timer, 0xFFFFFF7F);
    LODWORD(SpinCount) = 0;
    while( *((char *)Timer + 3) < 0 )
      KeYieldProcessorEx(&SpinCount);
  }
  if( v3 )
    _InterlockedAnd((volatile signed __int32 *)Timer, 0xFFFFFF7F);
  return v2;
}

Referenced by:

ExpCancelTimer
KeCancelTimer
KeCancelTimerInternal
KeSetTimerEx
KiSetTimerEx
KiSuspendThread
KiSwapThread