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.