PopBatteryApplyCompositeState

VOID __stdcall PopBatteryApplyCompositeState(_BATTERY_STATUS *CompositeStatus, UINT64 EstTime){
  unsigned int v2; 
  int v3; 
  int v5; 
  INT64 v6; 
  INT64 v7; 
  INT64 v8; 
  _BATTERY_STATUS v9; 
  int v10; 
  __int64 v11; 
  UINT64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  int v18; 
  _POP_ACTION_TRIGGER *v19; 
  _SYSTEM_POWER_CONDITION v20; 
  POP_BATTERY *v21; 
  NPTEXTMETRIC *v22; 
  INT64 v23; 
  POP_BATTERY v24; 
  __int64 v25; 
  unsigned int v26; 
  const CHAR *v27; 
  int v28; 
  unsigned __int8 v29; 
  char v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  _SQM_STREAM_ENTRY *v33; 
  INT64 SubstitutionPolicy; 
  __int64 SubstitutionPolicya; 
  INT64 MatchingChangeStamp; 
  UINT64 MatchingChangeStampa; 
  UINT64 MatchingChangeStampb; 
  INT64 CheckStamp; 
  UINT64 CheckStampa; 
  UINT64 CheckStampb; 
  INT64 v42; 
  INT64 v43; 
  UINT8 ForceTrace; 
  UINT64 Data; 
  INT64 a3; 
  int v47; 
  int v48; 
  int v49; 
  _EVENT_DATA_DESCRIPTOR v50; 
  int *v51; 
  __int64 v52; 
  int *v53; 
  __int64 v54; 
  _EVENT_DATA_DESCRIPTOR v55; 
  INT64 v56[4]; 
  int SqmStreamEntry[4]; 
  int v58[4]; 
  int v59[4]; 
  int v60[4]; 

  v2 = ~CompositeStatus->PowerState;
  a3 = 0i64;
  v3 = EstTime;
  ForceTrace = 0;
  v5 = v2 & 1;
  HIDWORD(Data) = v5;
  PopAcquirePolicyLock();
  if( PopUpdateAcDcState(v5) )
  {
    PopBatteryUpdateAlarms(1u, 0i64, v6, v7, SubstitutionPolicy, MatchingChangeStamp, CheckStamp);
    PopSetNotificationWork(4ui64);
    PopRecordAcDcState(v5);
    PopInitSIdle();
    PopInitilizeAcDcSettings();
    PpmProfileAcDcUpdate();
    if( v5 == 1 )
      PopMaxChargeRate = 0i64;
    ForceTrace = 1;
  }
  if( byte_140C23538 )
  {
    PopSetPowerSettingValueAcDc((_LPCGUID)&GUID_BATTERY_COUNT, 4ui64, &::Data);
    v21 = Battery;
    v22 = 0i64;
    v23 = 0i64;
    while( v21 != (POP_BATTERY *)&Battery )
    {
      v24 = v21[26];
      if( v24 == 2 )
      {
        v23 = (unsigned int)(v23 + 1);
      }
      else if( v24 == 4 )
      {
        v22 = (NPTEXTMETRIC *)(unsigned int)((_DWORD)v22 + 1);
      }
      v21 = *(POP_BATTERY **)v21;
    }
    if( PopCachedValidBatteryCount == -1 || PopCachedValidBatteryCount != (_DWORD)::Data )
    {
      PopCachedValidBatteryCount = ::Data;
      PopDiagTraceBatteryCountChange((unsigned int)::Data, v23, v22);
    }
    ForceTrace = 1;
  }
  PopReleasePolicyLock();
  PopBatteryCheckCompositeCapacity(
    CompositeStatus,
    v5,
    (INT64)&a3,
    v8,
    SubstitutionPolicy,
    MatchingChangeStamp,
    CheckStamp,
    v42);
  if( (((unsigned __int8)qword_140C23560 ^ LOBYTE(CompositeStatus->PowerState)) & 0xF) != 0 || byte_140C23538 )
  {
    PopSetNotificationWork(8ui64);
    byte_140C23538 = 0;
  }
  v9 = *CompositeStatus;
  v10 = 0;
  unk_140C23570 = v3;
  v11 = (unsigned int)_mm_cvtsi128_si32((__m128i)v9);
  if( v3 != -1 )
    v10 = v3;
  LODWORD(v43) = v10;
  LODWORD(CheckStampa) = HIDWORD(_mm_srli_si128((__m128i)v9, 8).m128i_u64[0]);
  LODWORD(MatchingChangeStampa) = _mm_cvtsi128_si32(_mm_srli_si128((__m128i)v9, 8));
  LODWORD(SubstitutionPolicya) = v9.Capacity;
  *(_BATTERY_STATUS *)&qword_140C23560 = v9;
  DbgPrintEx(
    0x92u,
    3u,
    "\n"
    "Composite Status\n"
    "|-- PowerState = 0x%08x\n"
    "|-- Capacity   = %u\n"
    "|-- Voltage    = %u\n"
    "|-- Rate       = %d\n"
    "|-- Est Time   = %u\n",
    v11,
    SubstitutionPolicya,
    MatchingChangeStampa,
    CheckStampa,
    v43);
  if( HIDWORD(qword_140C23580) )
    PopRecalculateCBTriggerLevels(v12);
  PopBatteryTraceSystemBatteryStatus(0);
  if( qword_140C23580
    && PopBatteryCheckTriggerAllBatteries((_POP_ACTION_TRIGGER *)((char *)&stru_140C23628 + 32), 1i64)
    && (*(&stru_140C23628 + 36) & 2) == 0 )
  {
    PopGetPolicyWorker(0x40ui64);
    PopCheckForWork();
  }
  PopAcquirePolicyLock();
  LODWORD(Data) = 0;
  v13 = 0;
  v14 = 0;
  v15 = (_DWORD)::Data != 0 ? 3 : 0;
  do
  {
    v16 = v14;
    v17 = 3i64 * v14;
    v18 = *((_DWORD *)&stru_140C23628 + 6 * v14 + 9);
    v19 = (_POP_ACTION_TRIGGER *)(0x140000000i64 + 24i64 * v14 + 12727880);
    if( PopBatteryCheckTrigger(v19) )
    {
      if( PopBatteryCachedFlags[v16] != v18 )
      {
        v25 = *(&stru_140C23628 + 232) + 96i64;
        PopBatteryCachedFlags[v16] = v18;
        PopDiagTraceBatteryAlarmStatus((INT64)v19, v25 + 8 * v17, &Data);
        v13 = Data;
        if( *((_DWORD *)&stru_140C23628 + 6 * (unsigned int)Data + 9) == 128 )
        {
          PopDiagTraceBatteryTriggerMet(
            0x140000000i64 + 24i64 * (unsigned int)Data + 12727880,
            *(&stru_140C23628 + 232) + 96i64 + 24i64 * (unsigned int)Data,
            (INT64 *)&Data);
          v13 = Data;
        }
      }
      if( !*(&stru_140C23628 + 24) )
        PopExecutePowerAction(
          (_POP_ACTION_TRIGGER *)(0x140000000i64 + 24i64 * v13 + 12727880),
          8ui64,
          (POWER_ACTION_POLICY *)(*(&stru_140C23628 + 232) + 104i64 + 24i64 * v13),
          *(_SYSTEM_POWER_STATE *)(*(&stru_140C23628 + 232) + 24i64 * v13 + 116),
          SubstituteLightestOverallDownwardBounded);
      if( v15 == 3 )
      {
        if( v13 )
        {
          if( v13 == 1 )
            v15 = 2;
        }
        else
        {
          v15 = 1;
        }
      }
    }
    else
    {
      PopBatteryCachedFlags[v16] = -1;
      *((_DWORD *)&stru_140C23628 + 2 * v17 + 9) = v18 & 0xFFFFFFFC;
      PopDiagTraceBatteryTriggerFlags(&Data, (INT64)v19);
      v13 = Data;
    }
    LODWORD(Data) = ++v13;
    v14 = v13;
  }
  while( v13 < 4 );
  v20 = HIDWORD(Data);
  if( dword_140C2359C != v15 )
  {
    HIDWORD(a3) = v15;
    LODWORD(CheckStampb) = 0;
    LODWORD(MatchingChangeStampb) = 0;
    ZwUpdateWnfStateData(
      &WNF_PO_BATTERY_CHARGE_LEVEL,
      (char *)&a3 + 4,
      4ui64,
      0i64,
      0i64,
      MatchingChangeStampb,
      CheckStampb);
    v26 = *(&stru_140C00F40 + 1194);
    if( *(&stru_140C00F40 + 1194) > 5u )
    {
      if( v15 )
      {
        if( v15 == 1 )
        {
          v27 = "PoBatteryLevelCritical";
        }
        else if( v15 == 2 )
        {
          v27 = "PoBatteryLevelLow";
        }
        else
        {
          v27 = "PoBatteryLevelNormal";
        }
      }
      else
      {
        v27 = "PoBatteryLevelUnknown";
      }
      tlgCreate1Sz_char((INT64)v56, v27);
      v47 = v28;
      v56[2] = (INT64)&v47;
      v56[3] = 4i64;
      tlgWriteTransfer_EtwWriteTransfer(
        (__int64)&stru_140C00F40 + 4776,
        (unsigned __int8 *)byte_140028A1B,
        0i64,
        0i64,
        4u,
        &v55);
      v26 = *(&stru_140C00F40 + 1194);
    }
    if( (unsigned int)(v15 - 1) <= 1 != (unsigned int)(dword_140C2359C - 1) <= 1
      && v26 > 5
      && tlgKeywordOn((__int64)&stru_140C00F40 + 4776, 0x400000000000i64) )
    {
      v48 = v29;
      v52 = 4i64;
      v51 = &v48;
      v49 = v15;
      v53 = &v49;
      v54 = 4i64;
      tlgWriteTransfer_EtwWriteTransfer(
        (__int64)&stru_140C00F40 + 4776,
        (unsigned __int8 *)byte_1400289D8,
        0i64,
        0i64,
        4u,
        &v50);
    }
    dword_140C2359C = v15;
    PopAcquireRwLockExclusive((_POP_RW_LOCK *)((char *)&stru_140C23628 + 6312));
    BYTE10(xmmword_140C502C8) = BYTE10(xmmword_140C502C8) & 0x3F | ((_BYTE)v15 << 6);
    PopBsdHandleRequest(1i64);
    PopReleaseRwLock((_POP_RW_LOCK *)((char *)&stru_140C23628 + 6312));
  }
  if( ForceTrace )
    PopTracePowerReconfig();
  PopReleasePolicyLock();
  PopAcquireRwLockExclusive((_POP_RW_LOCK *)((char *)&stru_140C23628 + 200));
  *(_OWORD *)((char *)&stru_140C23628 + 216) = 0i64;
  *(&stru_140C23628 + 223) = dword_140C23598;
  *(_OWORD *)((char *)&stru_140C23628 + 232) = 0i64;
  *(&stru_140C23628 + 216) = qword_140C23560 & 1;
  if( (_DWORD)::Data )
  {
    *(&stru_140C23628 + 217) = 1;
    *(&stru_140C23628 + 218) = (qword_140C23560 & 4) != 0;
    *(&stru_140C23628 + 56) = HIDWORD(qword_140C23580);
    *(&stru_140C23628 + 57) = HIDWORD(qword_140C23560);
    *(&stru_140C23628 + 58) = HIDWORD(qword_140C23568);
    *(&stru_140C23628 + 59) = unk_140C23570;
    *(&stru_140C23628 + 30) = qword_140C23588;
    *(&stru_140C23628 + 219) = *(&stru_140C23628 + 128) != 0 || (qword_140C23560 & 2) != 0;
  }
  PopAccountCbEnergyChange();
  PopReleaseRwLock((_POP_RW_LOCK *)((char *)&stru_140C23628 + 200));
  if( (_DWORD)a3 )
  {
    HIDWORD(Data) = (*(&stru_140C23628 + 33) + 500) / 0x3E8u;
    PopSetPowerSettingValueAcDc((_LPCGUID)&GUID_BATTERY_PERCENTAGE_REMAINING, 4ui64, (char *)&Data + 4);
    PopAcquireRwLockExclusive((_POP_RW_LOCK *)((char *)&stru_140C23628 + 6312));
    HIBYTE(xmmword_140C502C8) ^= (HIBYTE(xmmword_140C502C8) ^ BYTE4(Data)) & 0x7F;
    PopBsdHandleRequest(1i64);
    PopReleaseRwLock((_POP_RW_LOCK *)((char *)&stru_140C23628 + 6312));
    v30 = 1;
    LODWORD(v31) = 0;
    if( *(&stru_140C23628 + 33) != -1 )
      v30 = 0;
    v32 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
    if( v30 )
      v31 = (*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - *(&stru_140C23628 + 17) + 5000i64) / 0x2710ui64;
    if( PopPlatformAoAc )
    {
      PopSqmCreateDwordStreamEntry(SqmStreamEntry, HIDWORD(Data));
      PopSqmCreateDwordStreamEntry(v58, (unsigned int)a3);
      PopSqmCreateDwordStreamEntry(v59, v20 ^ 1u);
      PopSqmCreateDwordStreamEntry(v60, (unsigned int)v31);
      PopSqmAddToStream(v33);
    }
    PopBatteryTracePercentageRemaining(HIDWORD(Data), (unsigned int)a3, v20, (unsigned int)v31);
    *(&stru_140C23628 + 17) = v32;
  }
  PopEsQueueStateEvaluation(ForceTrace);
}

Referenced by:

PopBatteryWorker