HalpWdatDiscover

NTSTATUS __stdcall HalpWdatDiscover(){
  _LARGE_INTEGER *AcpiTable; 
  _LARGE_INTEGER *v1; 
  _WATCHDOG_TIMER_RESOURCE_TABLE *Wdrt; 
  int v4; 
  UINT64 v5; 
  INT64 v6; 
  char v7; 
  __int64 v8; 
  UINT64 v9; 
  INT64 v10; 
  unsigned __int64 v11; 
  bool v12; 
  _TIMER_INITIALIZATION_BLOCK NewTimer; 
  __int64 v14[18]; 
  char v15; 
  unsigned int v16; 
  UINT64 OutputValue; 

  LODWORD(OutputValue) = 0;
  v16 = 0;
  memset(&NewTimer, 0i64, sizeof(NewTimer));
  memset(v14, 0i64, 0x70u);
  NewTimer.Header.TableVersion = 1;
  NewTimer.Header.TableSize = 144;
  v15 = 0;
  AcpiTable = HalSocGetAcpiTable(0x54414457ui64);
  v1 = HalSocGetAcpiTable(0x54524457ui64);
  Wdrt = (_WATCHDOG_TIMER_RESOURCE_TABLE *)v1;
  if( AcpiTable )
  {
    v4 = HalpWdatProcessWdatInternalData((__int64)AcpiTable, v14, &v16, &v15);
  }
  else
  {
    if( !v1 )
      return 0;
    v14[1] = (__int64)v1;
    v4 = HalpWdatProcessWdrtInternalData((__int64)v1, v14, &v16, &v15);
  }
  v7 = v15;
  if( v4 >= 0 )
  {
    if( !v15 )
      return 0;
    if( LODWORD(v14[3]) )
    {
      v8 = LODWORD(v14[2]);
      if( LODWORD(v14[2]) >= HIDWORD(v14[2]) )
      {
        NewTimer.Capabilities = 163872;
        LOBYTE(v6) = 32;
        if( HalpWdatExecuteActionBeforeInitialize(
               v6,
               v5,
               &OutputValue,
               (_WATCHDOG_TIMER_ACTION_TABLE *)AcpiTable,
               Wdrt) >= 0
          && (_DWORD)OutputValue == 1 )
        {
          NewTimer.Capabilities = 426016;
          LOBYTE(v10) = 33;
          HalpWdatExecuteActionBeforeInitialize(v10, v9, 0i64, (_WATCHDOG_TIMER_ACTION_TABLE *)AcpiTable, Wdrt);
        }
        v11 = (unsigned __int64)LODWORD(v14[3]) * v8 / 0x3E8;
        if( v11 <= 0x12C436C73CE5i64 )
        {
          v5 = 894000 * v11;
          v6 = 63i64;
          NewTimer.CounterBitWidth = 63;
          do
          {
            if( (1i64 << v6) - 1 < v5 )
              break;
            v12 = (_DWORD)v6 == 1;
            v6 = (unsigned int)(v6 - 1);
          }
          while( !v12 );
          NewTimer.CounterBitWidth = v6;
          if( !(_DWORD)v6 )
            goto LABEL_20;
        }
        else
        {
          NewTimer.CounterBitWidth = 64;
        }
        NewTimer.FunctionTable.AcknowledgeInterrupt = 0i64;
        NewTimer.InternalData = 0i64;
        NewTimer.Identifier = 0;
        NewTimer.FunctionTable.Initialize = (PLONG)HalpWdatInitialize;
        NewTimer.FunctionTable.ArmTimer = (PLONG)HalpWdatArmTimer;
        NewTimer.FunctionTable.Stop = HalpWdatStop;
        NewTimer.InternalDataSize = v16;
        NewTimer.CounterFrequency = 894000i64;
        NewTimer.KnownType = TimerWDAT;
        HalpTimerRegister(&NewTimer, 0i64);
      }
    }
  }
LABEL_20:
  if( v7 )
  {
    LOBYTE(v6) = 11;
    HalpWdatExecuteActionBeforeInitialize(v6, v5, 0i64, (_WATCHDOG_TIMER_ACTION_TABLE *)AcpiTable, Wdrt);
  }
  return 0;
}

Referenced by:

HalpTimerRegisterBuiltinPluginsCommon