KiInsertTimer2WithCollectionLockHeld

UINT8 __stdcall KiInsertTimer2WithCollectionLockHeld(_KTIMER2 *Timer, UINT8 InsertLate, UINT8 *WasLate){
  bool *v3; 
  bool *v4; 
  unsigned __int8 v6; 
  UINT8 v7; 
  UINT8 v8; 
  int v10; 
  int v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 *v15; 
  bool v16; 
  int v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  _KTIMER2 *v20; 
  unsigned __int8 v21; 
  unsigned __int64 *v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  bool v25; 
  int v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  _KTIMER2 *v29; 
  bool v31; 
  signed __int32 *v32; 
  signed __int32 v33; 
  signed __int32 v34; 
  int v35[8]; 
  v4 = v3;
  v6 = Timer->CollectionIndex[0];
  v7 = InsertLate;
  v8 = 1;
  v10 = 0;
  *WasLate = 0;
  v11 = 0;
  *v3 = 0;
  if( v6 == 21 || (v6 & 0x20) != 0 && Timer->DueTime[0] == Timer->DueTime[1] )
  {
    Timer->CollectionIndex[0] = v6 | 0x10;
  }
  else
  {
    Timer->CollectionIndex[0] = v6 & 0xEF;
    v12 = 3i64 * (v6 & 7);
    v13 = KiTimer2Collections[v12 + 1];
    v14 = KiTimer2Collections[v12];
    v15 = (unsigned __int64 *)&KiTimer2Collections[v12];
    if( (v13 & 1) != 0 )
    {
      if( v14 )
        v14 ^= (unsigned __int64)v15;
      else
        v14 = 0i64;
    }
    v16 = 0;
    v17 = v13 & 1;
    if( v14 )
    {
      while( 1 )
      {
        if( Timer->DueTime[0] < *(_QWORD *)(v14 + 48) )
        {
          v18 = *(_QWORD *)v14;
          if( v17 )
          {
            if( !v18 )
              break;
            v18 ^= v14;
          }
          if( !v18 )
            break;
        }
        else
        {
          v18 = *(_QWORD *)(v14 + 8);
          if( v17 )
          {
            if( !v18 )
              goto LABEL_20;
            v18 ^= v14;
          }
          if( !v18 )
          {
LABEL_20:
            v16 = 1;
            break;
          }
        }
        v14 = v18;
      }
    }
    RtlRbInsertNodeEx(v15, v14, v16, (unsigned __int64)&Timer->24);
    v19 = v15[1];
    if( (v19 & 1) != 0 )
    {
      if( v19 == 1 )
        v20 = 0i64;
      else
        v20 = (_KTIMER2 *)(v19 ^ ((unsigned __int64)v15 | 1));
    }
    else
    {
      v20 = (_KTIMER2 *)v15[1];
    }
    if( v20 == (_KTIMER2 *)&Timer->24 )
    {
      v15[2] = Timer->DueTime[0];
      v11 = 1;
    }
    else
    {
      v11 = 0;
    }
  }
  v21 = Timer->CollectionIndex[1];
  if( Timer->DueTime[1] == -1i64 )
  {
    Timer->CollectionIndex[1] = v21 | 0x10;
  }
  else
  {
    Timer->CollectionIndex[1] = v21 & 0xEF;
    v22 = (unsigned __int64 *)(0x140000000i64 + 24i64 * (v21 & 7) + 12786240);
    v23 = *(_QWORD *)(0x140000008i64 + 24i64 * (v21 & 7) + 12786240);
    v24 = *v22;
    if( (v23 & 1) != 0 )
    {
      if( v24 )
        v24 ^= (unsigned __int64)v22;
      else
        v24 = 0i64;
    }
    v25 = 0;
    v26 = v23 & 1;
    if( v24 )
    {
      while( 1 )
      {
        if( Timer->DueTime[1] < *(_QWORD *)(v24 + 32) )
        {
          v27 = *(_QWORD *)v24;
          if( v26 )
          {
            if( !v27 )
              goto LABEL_40;
            v27 ^= v24;
          }
          if( !v27 )
          {
LABEL_40:
            v25 = 0;
            break;
          }
        }
        else
        {
          v27 = *(_QWORD *)(v24 + 8);
          if( v26 )
          {
            if( !v27 )
              goto LABEL_63;
            v27 ^= v24;
          }
          if( !v27 )
          {
LABEL_63:
            v25 = 1;
            break;
          }
        }
        v24 = v27;
      }
    }
    RtlRbInsertNodeEx(v22, v24, v25, (unsigned __int64)Timer->RbNodes[1].Children);
    v28 = v22[1];
    if( (v28 & 1) != 0 )
    {
      if( v28 == 1 )
        v29 = 0i64;
      else
        v29 = (_KTIMER2 *)(v28 ^ ((unsigned __int64)v22 | 1));
    }
    else
    {
      v29 = (_KTIMER2 *)v22[1];
    }
    if( v29 == (_KTIMER2 *)((char *)&Timer->ListEntry + 24) )
    {
      v10 = 1;
      v22[2] = Timer->DueTime[1];
    }
    v7 = InsertLate;
    v11 |= v10;
  }
  if( v11 )
  {
    if( KiNextTimer2DueTime > Timer->DueTime[0] )
    {
      KiNextTimer2DueTime = Timer->DueTime[0];
      _InterlockedOr(v35, 0);
    }
    if( Timer->DueTime[0] <= *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart )
    {
      *WasLate = 1;
      if( !v7 )
      {
        KiRemoveTimer2(Timer);
        v8 = 0;
      }
    }
  }
  if( (Timer->TypeFlags & 4) != 0 && _InterlockedIncrement(&KiHrTimerActiveCount) == 1 )
  {
    v31 = 0;
    v32 = (signed __int32 *)*((_QWORD *)*(&KiProcessorBlock + (unsigned int)KiClockTimerOwner) + 4247);
    if( v32 && (KiVelocityFlags & 0x40) != 0 )
    {
      _m_prefetchw(v32);
      v33 = *v32;
      do
      {
        v34 = v33;
        v33 = _InterlockedCompareExchange(v32, v33 | 0x80000, v33);
      }
      while( v34 != v33 );
      v31 = (v33 & 0x80000) == 0;
    }
    *v4 = v31;
  }
  return v8;
}

Referenced by:

KeSetTimer2
KiInsertTimer2