ExpSetTimer

NTSTATUS __stdcall ExpSetTimer(
        VOID *TimerHandle,
        INT8 PreviousMode,
        _LARGE_INTEGER *DueTime,
        VOID *TimerApcRoutine,
        VOID *a5,
        UINT64 a6,
        INT64 a7,
        VOID *TimerContext,
        _DIAGNOSTIC_CONTEXT *WakeReason,
        INT64 WakeImportant,
        UINT64 Period,
        UINT64 TolerableDelay,
        UINT8 *PreviousState){
  NTSTATUS result; 
  _OBJECT_TYPE *v17; 
  UINT64 v18; 
  UINT64 v19; 
  UINT64 P2; 

  P2 = 0i64;
  result = ObReferenceObjectByHandle(TimerHandle, 2ui64, 0i64, PreviousMode, (VOID **)&P2, 0i64);
  if( result >= 0 )
  {
    v17 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(P2 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(P2 - 48) >> 8)];
    if( v17 == ExpIRTimerObjectType )
    {
      if( TimerApcRoutine || a5 || a6 || (_DWORD)WakeReason || WakeImportant )
      {
        ObfDereferenceObjectWithTag((VOID *)P2, 0x746C6644ui64);
        return -1073741811;
      }
      else
      {
        return ExpSetTimerObject2((PVOID)P2);
      }
    }
    else if( v17 == ExTimerObjectType )
    {
      LODWORD(v19) = (_DWORD)WakeReason;
      LODWORD(v18) = (_DWORD)TimerContext;
      return ExpSetTimerObject(
               P2,
               PreviousMode,
               (INT64 *)DueTime,
               (INT32 *)TimerApcRoutine,
               (INT64)a5,
               a6,
               a7,
               v18,
               v19,
               (_BYTE *)WakeImportant);
    }
    else
    {
      ObfDereferenceObjectWithTag((VOID *)P2, 0x746C6644ui64);
      return -1073741788;
    }
  }
  return result;
}

Referenced by:

NtSetTimer