PopThermalWorker

VOID __stdcall PopThermalWorker(VOID *Parameter){
  int v1; 
  _POP_RW_LOCK *v2; 
  signed __int64 v4; 
  UINT64 v5; 
  _DEVICE_OBJECT *v6; 
  int v7; 
  UINT8 v8; 
  int v9; 
  char v10; 
  char v11; 
  char *v12; 
  char v13; 
  char v14; 
  char v15; 
  signed __int64 v16; 
  __int128 *v17; 
  UINT64 v18; 
  __int64 v19; 
  char v20; 
  UINT8 v21; 
  INT64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  INT64 v25; 
  char v26; 
  char v27; 
  char v28; 
  char v29; 
  INT16 v30; 
  char v31; 
  INT64 v32; 
  unsigned int v33; 
  char v34; 
  int v35; 
  UINT64 v36; 
  _DEVICE_OBJECT *v37; 
  unsigned int v38; 
  char v39; 
  char v40; 
  char v41; 
  __int64 v42; 
  signed __int64 v43; 
  __int64 v44; 
  signed __int64 v45; 
  UINT64 InputSize; 
  UINT64 OutputSize; 
  char v48; 
  UINT8 PassiveEngaged; 
  char v50; 
  char ThrottleDelta[12]; 
  __int64 v52; 
  UINT64 v53; 
  __int128 v54; 

  v1 = 0;
  v2 = (_POP_RW_LOCK *)((char *)Parameter + 432);
  v48 = 0;
  v50 = 0;
  v54 = 0i64;
  v4 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  v5 = *((_QWORD *)Parameter + 7);
  v6 = (_DEVICE_OBJECT *)*((_QWORD *)Parameter + 6);
  v53 = v5;
  *(_QWORD *)&ThrottleDelta[4] = v6;
  v52 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  PassiveEngaged = 0;
  *(_DWORD *)ThrottleDelta = 0;
  PopAcquireRwLockExclusive((_POP_RW_LOCK *)Parameter + 27);
  if( *((_BYTE *)Parameter + 66) )
  {
    *((_BYTE *)Parameter + 64) = 0;
    goto LABEL_69;
  }
  v7 = *(_DWORD *)(v5 + 48);
  v8 = 1;
  v9 = 4;
  if( v7 < 0 )
  {
    if( v7 == -1073741667 || v7 == -1073741536 )
      goto LABEL_7;
    if( *((_BYTE *)Parameter + 64) == 7 )
    {
      *((_BYTE *)Parameter + 64) = 1;
      goto LABEL_7;
    }
    *((_BYTE *)Parameter + 64) = 5;
LABEL_69:
    KeSetEvent((PRKEVENT)((char *)Parameter + 448), 0, 0);
    goto LABEL_26;
  }
  if( *((_BYTE *)Parameter + 64) == 1 )
  {
    v20 = *((_BYTE *)Parameter + 65);
    *((_QWORD *)Parameter + 30) = v4;
    if( (v20 & 2) == 0 )
    {
      *((_BYTE *)Parameter + 65) = v20 | 2;
      PopDiagTraceThermalZoneEnumeration(
        (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
        (_UNICODE_STRING *)Parameter + 65,
        v6);
    }
    PopCheckThermalPolicy((_POP_THERMAL_ZONE *)Parameter, v4, &PassiveEngaged, (INT64 *)ThrottleDelta);
    KeSetEvent((PRKEVENT)((char *)Parameter + 472), 0, 0);
    v21 = PassiveEngaged;
    goto LABEL_33;
  }
  if( *((_BYTE *)Parameter + 64) != 2 )
  {
    switch( *((_BYTE *)Parameter + 64) )
    {
      case 3:
        *((_BYTE *)Parameter + 69) = *((_BYTE *)Parameter + 70);
LABEL_7:
        v10 = 0;
        goto LABEL_8;
      case 4:
        *((_DWORD *)Parameter + 20) = *((_DWORD *)Parameter + 21);
        goto LABEL_7;
      case 6:
        *((_BYTE *)Parameter + 505) = *((_BYTE *)Parameter + 144);
        *((_BYTE *)Parameter + 64) = 10;
        goto LABEL_7;
      case 7:
        *((_BYTE *)Parameter + 228) = 1;
        *((_BYTE *)Parameter + 64) = 8;
        break;
      case 8:
        break;
      default:
        if( *((_BYTE *)Parameter + 64) != 10 )
        {
          PopInternalAddToDumpFile((VOID *)v5, 0xD0ui64, v6);
          KeBugCheckEx(0xA0u, (PVOID)0x500, (PVOID)5, (PVOID)v5, v6);
        }
        *((_BYTE *)Parameter + 64) = 7;
        goto LABEL_7;
    }
    v33 = *((_DWORD *)Parameter + 54);
    v21 = v33 < 0x64;
    v34 = *((_BYTE *)Parameter + 65);
    *(_DWORD *)ThrottleDelta = 10 * (*((_DWORD *)Parameter + 20) - v33);
    if( (v34 & 2) == 0 )
    {
      *((_BYTE *)Parameter + 65) = v34 | 2;
      PopDiagTraceThermalZoneEnumeration(
        (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
        (_UNICODE_STRING *)Parameter + 65,
        v6);
    }
LABEL_33:
    v22 = *((unsigned __int8 *)Parameter + 69);
    v23 = *((_DWORD *)Parameter + 55);
    v24 = *((unsigned __int8 *)Parameter + 144);
    if( v23 == (_DWORD)v22 )
    {
      v28 = *((_BYTE *)Parameter + 65);
      v31 = v28 & 4;
      if( v23 >= v24 )
      {
        if( !v31 )
          goto LABEL_40;
      }
      else if( v31 )
      {
        goto LABEL_40;
      }
    }
    *((_BYTE *)Parameter + 70) = *((_BYTE *)Parameter + 220);
    PopThermalUpdateActiveTimeTracking((INT64)Parameter + 504, v22);
    v26 = *((_BYTE *)Parameter + 65);
    v48 = 1;
    if( v23 >= v24 )
      goto LABEL_35;
    if( (v26 & 4) != 0 )
    {
      if( v23 >= v24 )
      {
LABEL_35:
        if( (v26 & 4) != 0 )
        {
          PopDiagTraceActiveCooling(
            (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
            *(_DEVICE_OBJECT **)&ThrottleDelta[4],
            0i64,
            Diagnostic);
          PopDiagTraceActiveCooling(
            (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
            *(_DEVICE_OBJECT **)&ThrottleDelta[4],
            0i64,
            Operational);
        }
      }
    }
    else
    {
      LOBYTE(v25) = 1;
      PopDiagTraceActiveCooling(
        (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
        *(_DEVICE_OBJECT **)&ThrottleDelta[4],
        v25,
        Diagnostic);
      LOBYTE(v32) = 1;
      PopDiagTraceActiveCooling(
        (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
        *(_DEVICE_OBJECT **)&ThrottleDelta[4],
        v32,
        Operational);
      *((_QWORD *)Parameter + 31) = v4;
    }
    v27 = *((_BYTE *)Parameter + 65);
    if( v23 < v24 )
      v28 = v27 | 4;
    else
      v28 = v27 & 0xFB;
    *((_BYTE *)Parameter + 65) = v28;
LABEL_40:
    if( *((_DWORD *)Parameter + 54) == *((_DWORD *)Parameter + 20) )
    {
      v6 = *(_DEVICE_OBJECT **)&ThrottleDelta[4];
      v29 = v28 & 1;
      if( v21 )
      {
        if( v29 )
          goto LABEL_43;
      }
      else if( !v29 )
      {
LABEL_43:
        PopCheckAndHandleThermalConditions((_POP_THERMAL_ZONE *)Parameter);
        v10 = v48;
        v2 = (_POP_RW_LOCK *)((char *)Parameter + 432);
        v4 = v52;
        v5 = v53;
        goto LABEL_8;
      }
    }
    else
    {
      PopThermalUpdatePassiveTimeTracking();
      v35 = *((_DWORD *)Parameter + 54);
      v6 = *(_DEVICE_OBJECT **)&ThrottleDelta[4];
      v36 = *((unsigned int *)Parameter + 32);
      v37 = *(_DEVICE_OBJECT **)&ThrottleDelta[4];
      v50 = 1;
      *((_DWORD *)Parameter + 21) = v35;
      PopDiagTraceThermalZoneThrottlePerfTrack(v36, (unsigned int)(100 - v35), v37);
    }
    v38 = *(_DWORD *)ThrottleDelta;
    PopDiagTracePassiveCooling(
      (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
      v6,
      v21,
      *(unsigned int *)ThrottleDelta,
      Diagnostic);
    v39 = *((_BYTE *)Parameter + 65);
    if( v21 )
    {
      if( (v39 & 1) == 0 )
      {
        PopDiagTracePassiveCooling((_THERMAL_INFORMATION_EX *)((char *)Parameter + 112), v6, 1u, v38, Operational);
        *((_QWORD *)Parameter + 32) = v52;
      }
    }
    else if( (v39 & 1) != 0 )
    {
      PopDiagTracePassiveCooling((_THERMAL_INFORMATION_EX *)((char *)Parameter + 112), v6, 0, v38, Operational);
      PopDiagTraceThermalZoneThrottleDurationPerfTrack((v52 - *((_QWORD *)Parameter + 32)) / 0x2710ui64, v6);
    }
    v40 = *((_BYTE *)Parameter + 65);
    if( v21 )
      v41 = v40 | 1;
    else
      v41 = v40 & 0xFE;
    *((_BYTE *)Parameter + 65) = v41;
    goto LABEL_43;
  }
  v30 = *((unsigned __int8 *)Parameter + 68);
  *((_BYTE *)Parameter + 67) = v30;
  PopDiagTraceThermalCoolingMode(v6, v30);
  if( *(&stru_140CF2E80 + 1950) )
    PopFireThermalWmiEvent(*((_BYTE *)Parameter + 67));
  v10 = 1;
LABEL_8:
  v11 = v50;
  v12 = (char *)Parameter + 70;
  v13 = v10;
  if( *((_BYTE *)Parameter + 69) != *((_BYTE *)Parameter + 70) )
    v13 = 1;
  v14 = *((_BYTE *)Parameter + 64);
  if( *((_DWORD *)Parameter + 20) != *((_DWORD *)Parameter + 21) )
    v11 = 1;
  switch( v14 )
  {
    case 6:
      goto LABEL_23;
    case 10:
      v9 = 16;
      v12 = (char *)Parameter + 1040;
      v8 = 0;
      v18 = 2703512i64;
      v1 = 16;
      goto LABEL_25;
    case 7:
LABEL_60:
      v12 = (char *)Parameter + 204;
      v18 = 2703508i64;
      *((_DWORD *)Parameter + 51) = 1;
      v8 = 0;
      v1 = 24;
      goto LABEL_24;
  }
  if( v13 )
  {
    *((_BYTE *)Parameter + 64) = 3;
    v18 = 2719880i64;
    goto LABEL_25;
  }
  if( v11 )
  {
    *((_BYTE *)Parameter + 64) = 4;
    v12 = (char *)Parameter + 84;
    v18 = 2719884i64;
    goto LABEL_25;
  }
  v15 = PopCoolingMode;
  if( *((unsigned __int8 *)Parameter + 67) != PopCoolingMode )
  {
    v12 = (char *)Parameter + 68;
    *((_BYTE *)Parameter + 64) = 2;
    *((_BYTE *)Parameter + 68) = v15;
    v18 = 2719876i64;
    v9 = 1;
    goto LABEL_25;
  }
  if( *((_BYTE *)Parameter + 228) )
  {
    *((_BYTE *)Parameter + 64) = 8;
    *((_BYTE *)Parameter + 208) = 1;
    goto LABEL_60;
  }
  v16 = 0i64;
  *((_BYTE *)Parameter + 64) = 1;
  if( (*((_BYTE *)Parameter + 65) & 1) != 0 )
  {
    v42 = *((unsigned int *)Parameter + 26);
    if( (_DWORD)v42 )
    {
      v43 = *((_QWORD *)Parameter + 12) + v42;
      if( v43 <= v4 )
        *((_DWORD *)Parameter + 28) = 0;
      else
        v16 = v43;
    }
  }
  v17 = 0i64;
  if( *(&stru_140C23628 + 579) )
  {
    v44 = *((unsigned int *)Parameter + 58);
    if( (_DWORD)v44 )
    {
      v45 = *((_QWORD *)Parameter + 30) + v44;
      if( v45 <= v4 )
      {
        *((_DWORD *)Parameter + 28) = 0;
        v16 = 0i64;
      }
      else if( !v16 || v16 >= v45 )
      {
        v16 = v45;
      }
    }
    if( !PopThermalPollingWakesAllowed )
    {
      *((_QWORD *)&v54 + 1) = -1i64;
      v17 = &v54;
    }
  }
  if( v16 )
    KeSetTimer2((INT64)Parameter + 296, v4 - v16, 0i64, (INT64)v17);
LABEL_23:
  v1 = 92;
  v12 = (char *)Parameter + 112;
  v18 = 2703488i64;
LABEL_24:
  v9 = v1;
LABEL_25:
  LODWORD(OutputSize) = v1;
  LODWORD(InputSize) = v9;
  PopPrepareIoctl(*((_IRP **)Parameter + 7), v18, v8, v12, InputSize, OutputSize);
  v19 = *(_QWORD *)(v5 + 184);
  *(_QWORD *)(v19 - 16) = PopThermalIrpComplete;
  *(_QWORD *)(v19 - 8) = Parameter;
  *(_BYTE *)(v19 - 69) = -32;
  IofCallDriver((UINT64)v6, v5);
LABEL_26:
  PopReleaseRwLock(v2);
}

Referenced by:

No references.