PopBatteryWorker
VOID __stdcall PopBatteryWorker(PVOID Parameter){
int v1;
void *v2;
void *v3;
void *v4;
int v5;
__int64 *i;
__int64 *j;
ULONG v8;
char v9;
__int32 v10;
bool v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
unsigned int v16;
unsigned int v17;
LONG v18;
unsigned int v19;
ULONG Voltage;
char v21;
int v22;
int v23;
__int64 *v24;
__int64 *v25;
__int64 **v26;
int v27;
int EstimatedTime;
int v29;
int v30;
__int64 v31;
int v32;
int v33;
unsigned int v34;
int v35;
__int64 v36;
unsigned int v37;
unsigned int v38;
__int64 *v39;
int v40;
unsigned int v41;
int updated;
bool v43;
const CHAR *v44;
char v45;
const CHAR *v46;
const CHAR *v47;
char v48;
const CHAR *v49;
const CHAR *v50;
char v51;
const CHAR *v52;
const CHAR *v53;
char v54;
const CHAR *v55;
const CHAR *v56;
char v57;
const CHAR *v58;
const CHAR *v59;
char v60;
const CHAR *v61;
int v62;
unsigned int v63;
unsigned __int64 v64;
const CHAR *v65;
int v66;
int v67;
int v68[8];
PLARGE_INTEGER Timeout;
int *v70;
__int64 v71;
__int64 v72;
__int64 v73;
BATTERY_STATUS CompositeStatus;
unsigned int v75;
unsigned int v76;
int v77;
int v78;
int v79;
int v80;
int v81;
unsigned int v82;
int v83;
int v84;
int v85;
__int64 v86;
int v87;
int v88;
int v89;
int v90;
int v91;
UINT64 v92;
__int64 v93;
__int64 v94;
__int64 v95;
__int64 v96;
__int128 v97;
__int128 v98;
__int128 v99;
_BYTE v100[24];
int v101;
struct _EVENT_DATA_DESCRIPTOR v102;
int *v103;
__int64 v104;
char v105[16];
char v106[16];
char v107[16];
char v108[16];
char v109[16];
char v110[16];
char v111[16];
int *v112;
__int64 v113;
int *v114;
__int64 v115;
int *v116;
__int64 v117;
int *v118;
__int64 v119;
__int64 *v120;
__int64 v121;
__int64 v122;
__int64 v123;
int *v124;
__int64 v125;
int *v126;
__int64 v127;
char v128[16];
int *v129;
__int64 v130;
int *v131;
__int64 v132;
struct _EVENT_DATA_DESCRIPTOR v133;
__int64 v134;
__int64 v135;
int *v136;
__int64 v137;
struct _EVENT_DATA_DESCRIPTOR v138;
int *v139;
__int64 v140;
v92 = 0i64;
v94 = 0i64;
v96 = 0i64;
LOBYTE(CompositeStatus.PowerState) = 0;
v98 = 0i64;
v99 = 0i64;
v101 = 0;
memset(v100, 0, sizeof(v100));
PopAcquireRwLockShared((UINT64)&PopPolicyDeviceLock);
PopBatteryAcquireExclusiveLock();
v93 = 0i64;
v70 = &v77;
v79 = 0;
Timeout = (PLARGE_INTEGER)&v93;
v77 = 8;
ZwQueryWnfStateData();
if( v1 == -1073741670 || v1 == -1073741431 )
{
v5 = 0;
}
else if( !v1 && v77 == 8 )
{
v5 = (v93 != 0) + 2;
}
else
{
v5 = 1;
}
for( i = (__int64 *)qword_140C23550; i != &qword_140C23550; i = (__int64 *)*i )
IoCancelIrp((KDPC *)*(i - 1), v2, v3, v4);
for( j = (__int64 *)qword_140C23550; j != &qword_140C23550; j = (__int64 *)*j )
KeWaitForSingleObject(j + 2, Executive, 0, 0, 0i64);
LOBYTE(v8) = 0;
v9 = 0;
do
{
v8 = (unsigned __int8)v8;
v10 = _InterlockedExchange(&PopBatteryWorkRequests, 0x80000000);
v78 = v10;
v11 = (v10 & 2) != 0;
if( (v10 & 8) != 0 )
v8 = 1;
CompositeStatus.Capacity = v8;
if( (v10 & 0x10) != 0 )
{
PopAcquirePolicyLock();
PopResetCBTriggers(0x80u);
PopReleasePolicyLock();
}
if( (v10 & 0x40) != 0 )
{
PopAcquireRwLockExclusive(&stru_140C236C8);
PopSendWeakChargerNotification();
PopReleaseRwLock((UINT64)&stru_140C236C8);
}
v12 = qword_140C23550;
if( (__int64 *)qword_140C23550 != &qword_140C23550 )
{
do
{
v25 = *(__int64 **)v12;
if( *(_DWORD *)(v12 - 64 + 104) == 2 )
{
if( v25[1] != v12 || (v26 = *(__int64 ***)(v12 + 8), *v26 != (__int64 *)v12) )
__fastfail(3u);
*v26 = v25;
v25[1] = (__int64)v26;
*(_QWORD *)v12 = 0i64;
LODWORD(dword_140C23534) = dword_140C23534 - 1;
++dword_140C23598;
byte_140C23538 = 1;
if( (int)PopBatteryReadTag(v12 - 64) < 0 )
PopBatteryWaitTag();
v11 = 1;
}
v12 = (__int64)v25;
}
while( v25 != &qword_140C23550 );
}
v13 = qword_140C23540;
if( (__int64 *)qword_140C23540 != &qword_140C23540 )
{
do
{
if( *(_DWORD *)(v13 + 104) == 1 )
{
KeWaitForSingleObject((PVOID)(v13 + 80), Executive, 0, 0, 0i64);
if( PopBatteryInitialize(v13) < 0 )
PopBatteryWaitTag();
else
v11 = 1;
}
v13 = *(_QWORD *)v13;
}
while( (__int64 *)v13 != &qword_140C23540 );
LOBYTE(v10) = v78;
}
v14 = qword_140C23550;
if( (__int64 *)qword_140C23550 != &qword_140C23550 )
{
do
{
v97 = *(_OWORD *)(v14 + 84);
if( PopBatteryQueryStatus(v14 - 64, 1) >= 0 )
{
PopAccountBatteryEnergyChange(v14 - 64);
v27 = *(_DWORD *)(v14 + 84);
if( (((unsigned __int8)v97 ^ *(_BYTE *)(v14 + 84)) & 7) != 0 )
{
v9 = 1;
}
else if( DWORD1(v97) != *(_DWORD *)(v14 + 88) || HIDWORD(v97) != *(_DWORD *)(v14 + 96) )
{
LOBYTE(v8) = 1;
}
EstimatedTime = -1;
if( (v27 & 2) != 0 )
{
EstimatedTime = PopBatteryQueryEstimatedTime(v14 - 64, 0i64);
v27 = *(_DWORD *)(v14 + 84);
}
v29 = 0;
*(_DWORD *)(v14 + 100) = EstimatedTime;
if( EstimatedTime != -1 )
v29 = EstimatedTime;
v30 = *(_DWORD *)(v14 + 96);
LODWORD(v73) = v29;
LODWORD(v72) = v30;
LODWORD(v71) = *(_DWORD *)(v14 + 92);
LODWORD(v70) = *(_DWORD *)(v14 + 88);
LODWORD(Timeout) = v27;
DbgPrintEx(
0x92u,
3u,
"\n"
"Battery Status [%p]\n"
"|-- PowerState = 0x%08x\n"
"|-- Capacity = %u\n"
"|-- Voltage = %u\n"
"|-- Rate = %d\n"
"|-- Est Time = %u\n",
v14 - 64,
Timeout,
v70,
v71,
v72,
v73);
}
else
{
*(_DWORD *)(v14 + 40) = 2;
PopBatteryQueueWork(1i64);
}
v14 = *(_QWORD *)v14;
}
while( (__int64 *)v14 != &qword_140C23550 );
LOBYTE(v10) = v78;
CompositeStatus.Capacity = v8;
}
if( v11 )
{
PopBatteryUpdateCompositeInformation();
PopMaxChargeRate = 0i64;
v9 = 1;
}
if( (v10 & 4) != 0 || v9 )
{
if( PopEstimateSpoilerMask )
{
v15 = -1i64;
PopEstimateSpoiledUntilTime = -1i64;
KeCancelTimer((PKTIMER)&qword_140C229A0);
}
else
{
PopEstimateSpoiledUntilTime = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + 300000000i64;
KiSetTimerEx((_KTIMER *)&qword_140C229A0, (_LARGE_INTEGER)-300000000i64, 0i64, 0, &PopPostSpoilingRefresh);
v15 = -1i64;
}
}
else
{
v15 = -1i64;
}
v92 = -1i64;
CompositeStatus.Voltage = 0;
v16 = 0x80000000;
v75 = -1;
v76 = 0x80000000;
v17 = -1;
CompositeStatus.Rate = -1;
v18 = -1;
v19 = -1;
if( (_DWORD)dword_140C23534 )
{
v31 = qword_140C23550;
Voltage = CompositeStatus.Voltage;
if( (__int64 *)qword_140C23550 != &qword_140C23550 )
{
do
{
v32 = *(_DWORD *)(v31 + 84) & 0xA;
Voltage |= *(_DWORD *)(v31 + 84) & 0x7F;
CompositeStatus.Voltage = Voltage;
if( (_BYTE)v32 == 10 )
{
Voltage |= 8u;
CompositeStatus.Voltage = Voltage;
}
v33 = *(_DWORD *)(v31 + 88);
if( v33 != -1 )
{
if( v18 == -1 )
v18 = 0;
v18 += v33;
CompositeStatus.Rate = v18;
}
v34 = *(_DWORD *)(v31 + 92);
if( v34 != -1 )
{
if( v17 == -1 )
v17 = 0;
if( v34 > v17 )
v17 = *(_DWORD *)(v31 + 92);
v75 = v17;
}
v35 = *(_DWORD *)(v31 + 96);
if( v35 != 0x80000000 )
{
if( v16 == 0x80000000 )
v16 = 0;
v16 += v35;
v76 = v16;
}
v31 = *(_QWORD *)v31;
}
while( (__int64 *)v31 != &qword_140C23550 );
v15 = -1i64;
}
if( (Voltage & 2) != 0 )
{
Voltage &= ~4u;
CompositeStatus.Voltage = Voltage;
}
if( (Voltage & 1) != 0 )
{
if( (Voltage & 4) != 0 )
v92 = PopEstimateChargeTime();
}
else
{
v36 = qword_140C23550;
v37 = 0;
if( (__int64 *)qword_140C23550 != &qword_140C23550 )
{
do
{
v38 = *(_DWORD *)(v36 + 100);
if( v38 - 1 <= 0xFFFFFFFD )
v37 -= 3600 * *(_DWORD *)(v36 + 88) / v38;
v36 = *(_QWORD *)v36;
}
while( (__int64 *)v36 != &qword_140C23550 );
LOBYTE(v8) = CompositeStatus.Capacity;
if( v37 )
{
v39 = (__int64 *)qword_140C23550;
do
{
v40 = PopBatteryQueryEstimatedTime((INT64)(v39 - 8), v37);
if( v40 != -1 )
{
v41 = 0;
if( v19 != -1 )
v41 = v19;
v19 = v40 + v41;
}
v39 = (__int64 *)*v39;
}
while( v39 != &qword_140C23550 );
LOBYTE(v8) = CompositeStatus.Capacity;
}
}
v15 = -1i64;
}
}
else
{
LOBYTE(Voltage) = 1;
CompositeStatus.Voltage = 1;
if( v5 == 3 && KeQueryUnbiasedInterruptTime() >= 0x11E1A300 )
v5 = 1;
}
v21 = CompositeStatus.Voltage & 1;
if( v5 == 2 && !v21 || v5 == 3 && v21 )
v5 = 1;
v22 = Voltage & 0x10;
if( (qword_140C23560 & 0x10) != v22 )
{
LODWORD(v71) = 0;
LODWORD(v70) = 0;
LOBYTE(CompositeStatus.PowerState) = v22 != 0;
Timeout = 0i64;
updated = ZwUpdateWnfStateData();
if( (unsigned int)dword_140C021E8 > 5 )
{
v80 = updated;
BYTE1(CompositeStatus.PowerState) = CompositeStatus.PowerState;
v136 = &v80;
v134 = (__int64)&CompositeStatus.PowerState + 1;
v137 = 4i64;
v135 = 1i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C021E8,
(unsigned __int8 *)byte_140028763,
0i64,
0i64,
4u,
&v133);
}
}
if( (Voltage & 0x20) != 0 )
v23 = ((Voltage & 0x40) != 0) + 1;
else
v23 = 0;
if( dword_140C236C0 != v23 )
{
PopAcquireRwLockExclusive(&stru_140C236C8);
if( v23 )
{
if( v23 != 1 )
{
if( v23 != 2 )
goto LABEL_136;
goto LABEL_129;
}
v43 = byte_140C236C4 == 0;
}
else
{
if( !byte_140C236C4 )
{
LABEL_129:
if( dword_140C236C0 == 1 )
goto LABEL_135;
goto LABEL_136;
}
v43 = dword_140C236C0 == 2;
}
if( v43 )
LABEL_135:
PopSendWeakChargerNotification();
LABEL_136:
PopReleaseRwLock((UINT64)&stru_140C236C8);
dword_140C236C0 = v23;
}
PopBatteryApplyCompositeState((BATTERY_STATUS *)&CompositeStatus.Voltage, v19);
_InterlockedAnd(&PopBatteryWorkRequests, 0xFFFFFFDF);
qword_140C236E0 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
_InterlockedOr(v68, 0);
if( stru_140C236E8.0 )
ExfUnblockPushLock(&stru_140C236E8, 0i64);
}
while( _InterlockedCompareExchange(&PopBatteryWorkRequests, 0, 0x80000000) != 0x80000000 );
v24 = (__int64 *)qword_140C23550;
if( (__int64 *)qword_140C23550 != &qword_140C23550 )
{
do
{
PopBatteryQueryStatus((INT64)(v24 - 8), 0);
v24 = (__int64 *)*v24;
}
while( v24 != &qword_140C23550 );
v15 = -1i64;
}
if( !PopUserBatteryChargingEstimator )
{
LODWORD(v71) = 0;
LODWORD(v70) = 0;
Timeout = 0i64;
ZwUpdateWnfStateData();
}
if( !PopDisableBatteryDischargeEstimator )
{
if( v19 != -1 && !(unsigned __int8)PopBatteryEstimatesSpoiled() )
v15 = v19;
LODWORD(v71) = 0;
LODWORD(v70) = 0;
v94 = v15;
Timeout = 0i64;
ZwUpdateWnfStateData();
}
if( (unsigned __int8)v9 | (unsigned __int8)v8 )
{
*(_DWORD *)v100 = dword_140C23594;
v98 = unk_140C23574;
v101 = dword_140C23530;
LODWORD(v71) = 0;
LODWORD(v70) = 0;
*(_OWORD *)&v100[4] = *(_OWORD *)&qword_140C23560;
*(_DWORD *)&v100[20] = dword_140C23534;
v99 = *(_OWORD *)((char *)&qword_140C23580 + 4);
Timeout = 0i64;
ZwUpdateWnfStateData();
if( (unsigned int)dword_140C021E8 > 5 && tlgKeywordOn((__int64)&dword_140C021E8, 0x400000000000i64) )
{
v44 = "AC Power";
v103 = &v81;
v81 = dword_140C23534;
v104 = 4i64;
if( (qword_140C23560 & 1) == 0 )
v44 = "DC Power";
tlgCreate1Sz_char((__int64)v105, v44);
v46 = "Battery Discharging";
if( (v45 & 2) == 0 )
v46 = "-";
tlgCreate1Sz_char((__int64)v106, v46);
v49 = "Battery Charging";
if( (v48 & 4) == 0 )
v49 = v47;
tlgCreate1Sz_char((__int64)v107, v49);
v52 = "Battery Critical";
if( (v51 & 8) == 0 )
v52 = v50;
tlgCreate1Sz_char((__int64)v108, v52);
v55 = "Battery charge limiting mode";
if( (v54 & 0x10) == 0 )
v55 = v53;
tlgCreate1Sz_char((__int64)v109, v55);
v58 = "Battery charging state power supply present";
if( (v57 & 0x20) == 0 )
v58 = v56;
tlgCreate1Sz_char((__int64)v110, v58);
v61 = "Battery charging state adequate";
if( (v60 & 0x40) == 0 )
v61 = v59;
tlgCreate1Sz_char((__int64)v111, v61);
if( HIDWORD(qword_140C23580) )
v63 = (unsigned int)((HIDWORD(qword_140C23580) >> 1) + 100 * HIDWORD(qword_140C23560))
/ HIDWORD(qword_140C23580);
else
v63 = 0;
v82 = v63;
v112 = (int *)&v82;
v113 = 4i64;
if( HIDWORD(qword_140C23580) )
v64 = 100000 * (unsigned __int64)HIDWORD(qword_140C23560) / HIDWORD(qword_140C23580);
else
LODWORD(v64) = 0;
v65 = "Relative Capacity Unit";
v83 = v64;
v115 = 4i64;
v114 = &v83;
v84 = HIDWORD(qword_140C23560);
v116 = &v84;
v118 = &v85;
v86 = qword_140C23568;
v120 = &v86;
v122 = (__int64)&v86 + 4;
v87 = dword_140C23530;
v124 = &v87;
v126 = &v88;
if( (unk_140C23574 & 0x40000000) == 0 )
v65 = "mWh Unit";
v117 = 4i64;
v85 = HIDWORD(qword_140C23580);
v119 = 4i64;
v121 = 4i64;
v123 = 4i64;
v125 = 4i64;
v88 = v62;
v127 = 4i64;
tlgCreate1Sz_char((__int64)v128, v65);
v129 = &v89;
v89 = qword_140C23580;
v131 = &v90;
v90 = v66;
v130 = 4i64;
v132 = 4i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C021E8,
(unsigned __int8 *)word_1400287F2,
0i64,
0i64,
0x15u,
&v102);
}
if( v5 == 1 )
{
if( v21 )
v95 = 0i64;
else
v95 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
LODWORD(v71) = 0;
LODWORD(v70) = 0;
Timeout = 0i64;
ZwUpdateWnfStateData();
}
if( v9 )
{
HIDWORD(v96) = -1;
LODWORD(v71) = 0;
LODWORD(v70) = 0;
Timeout = 0i64;
v67 = ZwUpdateWnfStateData();
if( (unsigned int)dword_140C021E8 > 5 )
{
v91 = v67;
v140 = 4i64;
v139 = &v91;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C021E8,
(unsigned __int8 *)&word_1400287BE,
0i64,
0i64,
3u,
&v138);
}
}
}
PopBatteryReleaseLock();
PopReleaseRwLock((UINT64)&PopPolicyDeviceLock);
}Referenced by:
No references.