NtSetTimerEx

NTSTATUS __stdcall NtSetTimerEx(
        PVOID TimerHandle,
        TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
        PVOID TimerSetInformation,
        UINT64 TimerSetInformationLength){
  __int128 *v4; 
  KPROCESSOR_MODE v6; 
  char *v7; 
  unsigned int v8; 
  UINT64 v9; 
  BYTE *v10; 
  INT64 v11; 
  volatile INT32 *v12; 
  int v13; 
  _OBJECT_TYPE *v14; 
  int v15; 
  NTSTATUS result; 
  UINT64 v17; 
  UINT64 v18; 
  BOOL v19; 
  _DWORD v20[3]; 
  PVOID Object; 
  __int128 v22; 
  __int128 v23; 
  __int128 v24; 
  v4 = (__int128 *)TimerSetInformation;
  v22 = 0i64;
  v23 = 0i64;
  v24 = 0i64;
  LOBYTE(v19) = 0;
  *(_QWORD *)&v20[1] = 0i64;
  v6 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( v6 && (_DWORD)TimerSetInformationLength )
  {
    if( ((unsigned __int8)TimerSetInformation & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    v7 = (char *)TimerSetInformation + (unsigned int)TimerSetInformationLength;
    if( (unsigned __int64)v7 > 0x7FFFFFFF0000i64 || v7 < TimerSetInformation )
      MEMORY[0x7FFFFFFF0000] = 0;
  }
  if( TimerSetInformationClass )
    return -1073741821;
  if( (_DWORD)TimerSetInformationLength != 48 )
    return -1073741820;
  if( v6 )
  {
    v22 = *(_OWORD *)TimerSetInformation;
    v23 = *((_OWORD *)TimerSetInformation + 1);
    v24 = *((_OWORD *)TimerSetInformation + 2);
    v4 = &v22;
  }
  v8 = *((_DWORD *)v4 + 8);
  if( v8 > 0x7FFFFFFF )
    return -1073741583;
  v9 = *((_QWORD *)v4 + 3);
  if( !v9 )
  {
LABEL_14:
    v10 = (BYTE *)*((_QWORD *)v4 + 5);
    v20[0] = *((_DWORD *)v4 + 9);
    v11 = *((_QWORD *)v4 + 2);
    v12 = (volatile INT32 *)*((_QWORD *)v4 + 1);
    Object = 0i64;
    v13 = ObReferenceObjectByHandle(TimerHandle, 2u, 0i64, v6, &Object, 0i64);
    if( v13 < 0 )
    {
LABEL_19:
      if( v13 >= 0 && v13 != 1073741861 )
        return v13;
      goto LABEL_36;
    }
    v14 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8)];
    if( v14 == ExpIRTimerObjectType )
    {
      if( !v12 && !v11 && !*(_QWORD *)&v20[1] && !v20[0] && !v10 )
      {
        v15 = ExpSetTimerObject2(Object);
        goto LABEL_18;
      }
      ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
      v13 = -1073741811;
    }
    else
    {
      if( v14 == ExTimerObjectType )
      {
        LODWORD(v18) = v20[0];
        LODWORD(v17) = v8;
        v15 = ExpSetTimerObject((UINT64)Object, v6, (INT64 *)v4, v12, v11, *(INT64 *)&v20[1], v19, v17, v18, v10);
LABEL_18:
        v13 = v15;
        goto LABEL_19;
      }
      ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
      v13 = -1073741788;
    }
LABEL_36:
    if( *(_QWORD *)&v20[1] )
      PoDestroyReasonContext(*(PVOID *)&v20[1]);
    return v13;
  }
  result = PoCaptureReasonContext(v9, v6, 0i64, 0, &v19, (INT64 *)&v20[1]);
  if( result >= 0 )
  {
    v8 = *((_DWORD *)v4 + 8);
    goto LABEL_14;
  }
  return result;
}

Referenced by:

No references.