NtSetTimer

NTSTATUS __stdcall NtSetTimer(
        _HANDLE TimerHandle,
        PLARGE_INTEGER DueTime,
        PTIMER_APC_ROUTINE TimerApcRoutine,
        PVOID TimerContext,
        BOOL WakeTimer,
        _LONG Period,
        PBOOLEAN PreviousState){
  _LARGE_INTEGER *v9; 
  char v10; 
  char PreviousMode; 
  __int64 v12; 
  BOOL v13; 
  _DIAGNOSTIC_CONTEXT *v14; 
  NTSTATUS v15; 
  NTSTATUS v16; 
  NTSTATUS result; 
  INT64 a7; 
  VOID *TimerContexta; 
  _DIAGNOSTIC_CONTEXT *WakeReason; 
  INT64 v21; 
  LONGLONG v22; 
  UINT64 a6[2]; 
  VOID *TimerHandlea; 

  TimerHandlea = *(VOID **)&TimerHandle;
  v9 = DueTime;
  v22 = 0i64;
  LOBYTE(v21) = 0;
  a6[0] = 0i64;
  v10 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    v12 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)DueTime < 0x7FFFFFFF0000i64 )
      v12 = (__int64)DueTime;
    v22 = *(_QWORD *)v12;
    v9 = (_LARGE_INTEGER *)&v22;
    a6[1] = (UINT64)&v22;
    v13 = WakeTimer;
  }
  else
  {
    v13 = WakeTimer;
    if( WakeTimer && PoPowerDownActionInProgress )
      v10 = 1;
  }
  if( Period < 0 )
    return -1073741580;
  if( !v13
    || v10
    || (result = PoCaptureReasonContext(0i64, PreviousMode, 0i64, 1u, (UINT8 *)&v21, (_DIAGNOSTIC_CONTEXT **)a6),
        result >= 0) )
  {
    LODWORD(WakeReason) = 0;
    LODWORD(TimerContexta) = Period;
    LOBYTE(a7) = v21;
    v14 = (_DIAGNOSTIC_CONTEXT *)a6[0];
    v15 = ExpSetTimer(
            TimerHandlea,
            PreviousMode,
            v9,
            TimerApcRoutine,
            TimerContext,
            a6[0],
            a7,
            TimerContexta,
            WakeReason,
            (INT64)PreviousState,
            v21,
            v22,
            (UINT8 *)a6[0]);
    v16 = v15;
    if( (v15 < 0 || v15 == 1073741861) && v14 )
      PoDestroyReasonContext(v14);
    if( v16 >= 0 )
    {
      if( v10 )
        return 1073741861;
    }
    return v16;
  }
  return result;
}

Referenced by:

No references.