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