HalpVpptTimerRegister

INT64 __stdcall HalpVpptTimerRegister(){
  char v0; 
  INT64 v1; 
  INT64 v2; 
  INT64 result; 
  int v4; 
  int v5; 
  int v6; 
  bool v7; 
  _TIMER_INITIALIZATION_BLOCK NewTimer; 
  __int128 v9; 
  __int128 v10; 
  __int128 v11; 

  v2 = v1;
  if( !v1 )
    return 3221225485i64;
  if( v0 && (*(_DWORD *)(v1 + 224) & 0x8000) == 0 )
    return 3221225659i64;
  if( (*(_DWORD *)(v1 + 224) & 1) != 0 )
    return 3221225659i64;
  v4 = *(_DWORD *)(v1 + 224) & 0xB00;
  if( !v4 )
    return 3221225659i64;
  LODWORD(result) = HalSocRequestApi(v1, 0i64, 7i64, 0x10ui64, &qword_140C4A430);
  if( (int)result >= 0 )
  {
    if( _InterlockedExchange(dword_140C4A450, 1) )
    {
      return 3221227288i64;
    }
    else
    {
      LODWORD(dword_140C4A428) = -1;
      qword_140C4A480 = (PVOID)v2;
      ExtEnvInitializeSpinLock();
      qword_140C4A448 = (__int64)&Arg2;
      Arg2 = (INT64)&Arg2;
      memset(&NewTimer, 0i64, sizeof(NewTimer));
      NewTimer.Identifier = 0;
      NewTimer.FunctionTable.Initialize = (PLONG)HalpVpptInitialize;
      NewTimer.Header.TableVersion = 1;
      NewTimer.FunctionTable.ArmTimer = (PLONG)HalpVpptArmTimer;
      NewTimer.FunctionTable.Stop = HalpVpptStop;
      NewTimer.FunctionTable.AcknowledgeInterrupt = HalpVpptAcknowledgeInterrupt;
      v5 = *(_DWORD *)(v2 + 224) & 0x8000;
      NewTimer.Header.TableSize = 144;
      NewTimer.CounterBitWidth = 64;
      NewTimer.InternalDataSize = 48;
      NewTimer.Capabilities = v4 | v5 | 0x210031;
      NewTimer.Interrupt.Mode = *(_DWORD *)(v2 + 96);
      NewTimer.Interrupt.Polarity = *(_DWORD *)(v2 + 92);
      NewTimer.Interrupt.Gsi = *(_DWORD *)(v2 + 88);
      v6 = *(_DWORD *)(v2 + 84);
      v10 = 0i64;
      LODWORD(v10) = -1;
      v7 = *(_DWORD *)(v2 + 228) == 2;
      NewTimer.Interrupt.LegacyIrq = v6;
      NewTimer.InternalData = &v9;
      v9 = 0i64;
      NewTimer.KnownType = TimerVPPT;
      v11 = 0i64;
      if( v7 )
        NewTimer.CounterFrequency = *(_QWORD *)(v2 + 192);
      else
        NewTimer.CounterFrequency = 10000000i64;
      LODWORD(result) = HalpTimerRegister(&NewTimer, 0i64);
    }
  }
  return result;
}

Referenced by:

HalpTimerSelectRoles