HalpSfiTimerDiscover

NTSTATUS __stdcall HalpSfiTimerDiscover(){
  _LARGE_INTEGER *AcpiTable; 
  _LARGE_INTEGER *v1; 
  __int64 HighPart; 
  unsigned int v4; 
  unsigned __int64 v5; 
  _LARGE_INTEGER *v6; 
  unsigned __int64 LowPart; 
  unsigned __int64 v8; 
  _LARGE_INTEGER v9; 
  __int128 v10; 
  __int64 v11; 
  _TIMER_INITIALIZATION_BLOCK NewTimer; 

  memset(&NewTimer, 0i64, sizeof(NewTimer));
  v11 = 0i64;
  v10 = 0i64;
  AcpiTable = HalSocGetAcpiTable(0x524D544Dui64);
  v1 = AcpiTable;
  if( AcpiTable )
  {
    HighPart = (unsigned int)AcpiTable->anonymous_0.HighPart;
    if( (unsigned int)HighPart >= 0x38 )
    {
      v4 = 0;
      v5 = (HighPart - 36) / 0x14ui64;
      if( (_DWORD)v5 )
      {
        v6 = v1 + 6;
        do
        {
          if( !BYTE4(v6[-2].QuadPart)
            && BYTE5(v6[-2].QuadPart) == 32
            && !BYTE6(v6[-2].QuadPart)
            && v6->anonymous_0.LowPart
            && v6[-1].QuadPart )
          {
            memset(&NewTimer, 0i64, sizeof(NewTimer));
            NewTimer.Header.TableVersion = 1;
            v11 = 0i64;
            v10 = 0i64;
            LowPart = v6->anonymous_0.LowPart;
            NewTimer.Header.TableSize = 144;
            NewTimer.CounterBitWidth = 32;
            NewTimer.InternalDataSize = 24;
            v8 = ((LowPart >> 1) + 1000000000000000i64) / LowPart;
            v9 = v6[-1];
            NewTimer.CounterFrequency = v8;
            NewTimer.InternalData = &v10;
            NewTimer.Interrupt.Gsi = v6->anonymous_0.HighPart;
            NewTimer.FunctionTable.Initialize = (PLONG)HalpSfiTimerInitialize;
            NewTimer.FunctionTable.QueryCounter = (PULONG64)HalpSfiTimerQueryCounter;
            NewTimer.FunctionTable.AcknowledgeInterrupt = HalpSfiTimerAcknowledgeInterrupt;
            NewTimer.FunctionTable.ArmTimer = (PLONG)HalpSfiTimerArm;
            NewTimer.FunctionTable.Stop = HalpSfiTimerStop;
            NewTimer.Interrupt.Mode = Latched;
            NewTimer.Interrupt.Polarity = InterruptActiveHigh;
            NewTimer.KnownType = TimerSfi;
            NewTimer.MaxDivisor = 1;
            NewTimer.Capabilities = 610;
            if( HalRegisterPermanentAddressUsage(v9, 0x14u) < 0 )
              return 0;
            HIDWORD(v11) = v4;
            *(_LARGE_INTEGER *)&v10 = v6[-1];
            HalpTimerRegister(&NewTimer, 0i64);
          }
          ++v4;
          v6 = (_LARGE_INTEGER *)((char *)v6 + 20);
        }
        while( v4 < (unsigned int)v5 );
      }
    }
  }
  return 0;
}

Referenced by:

HalpTimerRegisterBuiltinPlugins