KiTimerExpiration

INT64 __fastcall KiTimerExpiration(__int64 a1, int a2, unsigned __int64 a3, char a4, int *a5){
  INT64 result; 
  __int64 v9; 
  __int64 v10; 
  INT64 v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  unsigned int v14; 
  unsigned int v15; 
  int v16; 
  INT64 v17; 
  UINT64 v18; 
  result = KiSelectActiveTimerTable(a1, 1);
  v11 = result;
  if( result )
  {
    v12 = *(_DWORD *)(v9 + 35584);
    *(_DWORD *)(a1 + 35584) = ((_BYTE)v12 + 1) & 0xF;
    *(_QWORD *)(a1 + 16i64 * v12 + 35592) = v10;
    *(LARGE_INTEGER *)(a1 + 16i64 * v12 + 35600) = KeQueryPerformanceCounter(0i64);
    v13 = 0i64;
    v14 = (a3 >> 18) - a2 + 1;
    if( v14 > 0x100 )
      v13 = ((a3 >> 18) - v14 + 1) << 18;
    do
    {
      if( v14 <= 0x100 )
      {
        v15 = v14;
        v16 = 256 - v14;
        v13 = a3;
        if( 256 - v14 > 0x18 )
          v16 = 24;
      }
      else
      {
        v13 += 0x4000000i64;
        v15 = 256;
        v16 = 0;
      }
      LODWORD(v18) = 0;
      LODWORD(v17) = v16;
      KiExpireTimerTable((struct KPRCB *)a1, v11, (unsigned int)a2, v15, v17, v13, v18, (INT64 *)a5);
      if( a4 )
      {
        LODWORD(v18) = 1;
        LODWORD(v17) = v16;
        KiExpireTimerTable((struct KPRCB *)a1, v11, (unsigned int)a2, v15, v17, v13, v18, (INT64 *)a5);
      }
      a2 += v15;
      result = 24i64;
      v14 -= v15;
    }
    while( v14 );
    if( (*(_BYTE *)(a1 + 12588) & 8) == 0 )
    {
      *(_DWORD *)(a1 + 32420) = 0;
      result = *(unsigned int *)(a1 + 32424);
      if( (unsigned int)result >= KeTimeIncrement )
      {
        result = (unsigned int)(result - KeTimeIncrement);
        *(_DWORD *)(a1 + 32424) = result;
      }
      else
      {
        *(_DWORD *)(a1 + 32424) = 0;
      }
    }
  }
  return result;
}

Referenced by:

KiTimerExpirationDpc