PopThermalWorker

VOID __stdcall PopThermalWorker(PVOID Parameter){
  int v1; 
  char *v2; 
  signed __int64 v4; 
  ULONG_PTR v5; 
  DEVICE_OBJECT *v6; 
  EVENT_DESCRIPTOR *v7; 
  int v8; 
  UINT8 v9; 
  int v10; 
  char v11; 
  char v12; 
  char *v13; 
  char v14; 
  char v15; 
  char v16; 
  signed __int64 v17; 
  _EXT_SET_PARAMETERS_V0 *v18; 
  UINT64 v19; 
  __int64 v20; 
  char v21; 
  char v22; 
  INT64 v23; 
  unsigned int v24; 
  unsigned int v25; 
  char v26; 
  char v27; 
  char v28; 
  char v29; 
  UINT16 v30; 
  char v31; 
  EVENT_DESCRIPTOR *v32; 
  unsigned int v33; 
  char v34; 
  int v35; 
  UINT64 v36; 
  DEVICE_OBJECT *v37; 
  int v38; 
  EVENT_DESCRIPTOR *v39; 
  char v40; 
  char v41; 
  char v42; 
  __int64 v43; 
  signed __int64 v44; 
  __int64 v45; 
  signed __int64 v46; 
  ULONG_PTR BugCheckParameter4; 
  UINT64 OutputSize; 
  char v49; 
  UINT8 PassiveEngaged; 
  char v51; 
  INT ThrottleDelta; 
  DEVICE_OBJECT *DeviceObject; 
  __int64 v54; 
  ULONG_PTR v55; 
  __int128 v56; 
  v1 = 0;
  v2 = (char *)Parameter + 432;
  v49 = 0;
  v51 = 0;
  v56 = 0i64;
  v4 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  v5 = *((_QWORD *)Parameter + 7);
  v6 = (DEVICE_OBJECT *)*((_QWORD *)Parameter + 6);
  v55 = v5;
  DeviceObject = v6;
  v54 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  PassiveEngaged = 0;
  ThrottleDelta = 0;
  PopAcquireRwLockExclusive((_POP_RW_LOCK *)Parameter + 27);
  if( *((_BYTE *)Parameter + 66) )
  {
    *((_BYTE *)Parameter + 64) = 0;
    goto LABEL_69;
  }
  v8 = *(_DWORD *)(v5 + 48);
  v9 = 1;
  v10 = 4;
  if( v8 < 0 )
  {
    if( v8 == -1073741667 || v8 == -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);
    goto LABEL_26;
  }
  if( *((_BYTE *)Parameter + 64) == 1 )
  {
    v21 = *((_BYTE *)Parameter + 65);
    *((_QWORD *)Parameter + 30) = v4;
    if( (v21 & 2) == 0 )
    {
      *((_BYTE *)Parameter + 65) = v21 | 2;
      PopDiagTraceThermalZoneEnumeration(
        (_THERMAL_INFORMATION_EX *)((char *)Parameter + 112),
        (_UNICODE_STRING *)Parameter + 65,
        v6);
    }
    PopCheckThermalPolicy((_POP_THERMAL_ZONE *)Parameter, v4, &PassiveEngaged, &ThrottleDelta);
    KeSetEvent((PRKEVENT)((char *)Parameter + 472), 0);
    v22 = PassiveEngaged;
    goto LABEL_33;
  }
  if( *((_BYTE *)Parameter + 64) != 2 )
  {
    switch( *((_BYTE *)Parameter + 64) )
    {
      case 3:
        *((_BYTE *)Parameter + 69) = *((_BYTE *)Parameter + 70);
LABEL_7:
        v11 = 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((PVOID)v5, 0xD0ui64, v6);
          KeBugCheckEx(0xA0u, 0x500ui64, 5ui64, v5, (ULONG_PTR)v6);
        }
        *((_BYTE *)Parameter + 64) = 7;
        goto LABEL_7;
    }
    v33 = *((_DWORD *)Parameter + 54);
    v22 = v33 < 0x64;
    v34 = *((_BYTE *)Parameter + 65);
    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:
    v23 = *((unsigned __int8 *)Parameter + 69);
    v24 = *((_DWORD *)Parameter + 55);
    v25 = *((unsigned __int8 *)Parameter + 144);
    if( v24 == (_DWORD)v23 )
    {
      v28 = *((_BYTE *)Parameter + 65);
      v31 = v28 & 4;
      if( v24 >= v25 )
      {
        if( !v31 )
          goto LABEL_40;
      }
      else if( v31 )
      {
        goto LABEL_40;
      }
    }
    *((_BYTE *)Parameter + 70) = *((_BYTE *)Parameter + 220);
    PopThermalUpdateActiveTimeTracking((INT64)Parameter + 504, v23);
    v26 = *((_BYTE *)Parameter + 65);
    v49 = 1;
    if( v24 >= v25 )
      goto LABEL_35;
    if( (v26 & 4) != 0 )
    {
      if( v24 >= v25 )
      {
LABEL_35:
        if( (v26 & 4) != 0 )
        {
          PopDiagTraceActiveCooling((__int64)Parameter + 112, (__int64)DeviceObject, 0i64, 0);
          PopDiagTraceActiveCooling((__int64)Parameter + 112, (__int64)DeviceObject, 0i64, 1u);
        }
      }
    }
    else
    {
      LOBYTE(v7) = 1;
      PopDiagTraceActiveCooling((__int64)Parameter + 112, (__int64)DeviceObject, v7, 0);
      LOBYTE(v32) = 1;
      PopDiagTraceActiveCooling((__int64)Parameter + 112, (__int64)DeviceObject, v32, 1u);
      *((_QWORD *)Parameter + 31) = v4;
    }
    v27 = *((_BYTE *)Parameter + 65);
    if( v24 < v25 )
      v28 = v27 | 4;
    else
      v28 = v27 & 0xFB;
    *((_BYTE *)Parameter + 65) = v28;
LABEL_40:
    if( *((_DWORD *)Parameter + 54) == *((_DWORD *)Parameter + 20) )
    {
      v6 = DeviceObject;
      v29 = v28 & 1;
      if( v22 )
      {
        if( v29 )
          goto LABEL_43;
      }
      else if( !v29 )
      {
LABEL_43:
        PopCheckAndHandleThermalConditions((_POP_THERMAL_ZONE *)Parameter);
        v11 = v49;
        v2 = (char *)Parameter + 432;
        v4 = v54;
        v5 = v55;
        goto LABEL_8;
      }
    }
    else
    {
      PopThermalUpdatePassiveTimeTracking(
        (_POP_THERMAL_TELEMETRY_TRACKER *)((char *)Parameter + 504),
        *((_BYTE *)Parameter + 80));
      v35 = *((_DWORD *)Parameter + 54);
      v6 = DeviceObject;
      v36 = *((unsigned int *)Parameter + 32);
      v37 = DeviceObject;
      v51 = 1;
      *((_DWORD *)Parameter + 21) = v35;
      PopDiagTraceThermalZoneThrottlePerfTrack(v36, (unsigned int)(100 - v35), v37);
    }
    v38 = ThrottleDelta;
    LOBYTE(v7) = v22;
    PopDiagTracePassiveCooling((__int64)Parameter + 112, (__int64)v6, v7, ThrottleDelta, 0);
    v40 = *((_BYTE *)Parameter + 65);
    if( v22 )
    {
      if( (v40 & 1) == 0 )
      {
        LOBYTE(v39) = 1;
        PopDiagTracePassiveCooling((__int64)Parameter + 112, (__int64)v6, v39, v38, 1u);
        *((_QWORD *)Parameter + 32) = v54;
      }
    }
    else if( (v40 & 1) != 0 )
    {
      PopDiagTracePassiveCooling((__int64)Parameter + 112, (__int64)v6, 0i64, v38, 1u);
      PopDiagTraceThermalZoneThrottleDurationPerfTrack((v54 - *((_QWORD *)Parameter + 32)) / 0x2710ui64, v6);
    }
    v41 = *((_BYTE *)Parameter + 65);
    if( v22 )
      v42 = v41 | 1;
    else
      v42 = v41 & 0xFE;
    *((_BYTE *)Parameter + 65) = v42;
    goto LABEL_43;
  }
  v30 = *((unsigned __int8 *)Parameter + 68);
  *((_BYTE *)Parameter + 67) = v30;
  PopDiagTraceThermalCoolingMode(v6, v30);
  if( WmiThermalPolicyEventEnabled )
    PopFireThermalWmiEvent(*((_BYTE *)Parameter + 67));
  v11 = 1;
LABEL_8:
  v12 = v51;
  v13 = (char *)Parameter + 70;
  v14 = v11;
  if( *((_BYTE *)Parameter + 69) != *((_BYTE *)Parameter + 70) )
    v14 = 1;
  v15 = *((_BYTE *)Parameter + 64);
  if( *((_DWORD *)Parameter + 20) != *((_DWORD *)Parameter + 21) )
    v12 = 1;
  switch( v15 )
  {
    case 6:
      goto LABEL_23;
    case 10:
      v10 = 16;
      v13 = (char *)Parameter + 1040;
      v9 = 0;
      v19 = 2703512i64;
      v1 = 16;
      goto LABEL_25;
    case 7:
LABEL_60:
      v13 = (char *)Parameter + 204;
      v19 = 2703508i64;
      *((_DWORD *)Parameter + 51) = 1;
      v9 = 0;
      v1 = 24;
      goto LABEL_24;
  }
  if( v14 )
  {
    *((_BYTE *)Parameter + 64) = 3;
    v19 = 2719880i64;
    goto LABEL_25;
  }
  if( v12 )
  {
    *((_BYTE *)Parameter + 64) = 4;
    v13 = (char *)Parameter + 84;
    v19 = 2719884i64;
    goto LABEL_25;
  }
  v16 = PopCoolingMode;
  if( *((unsigned __int8 *)Parameter + 67) != PopCoolingMode )
  {
    v13 = (char *)Parameter + 68;
    *((_BYTE *)Parameter + 64) = 2;
    *((_BYTE *)Parameter + 68) = v16;
    v19 = 2719876i64;
    v10 = 1;
    goto LABEL_25;
  }
  if( *((_BYTE *)Parameter + 228) )
  {
    *((_BYTE *)Parameter + 64) = 8;
    *((_BYTE *)Parameter + 208) = 1;
    goto LABEL_60;
  }
  v17 = 0i64;
  *((_BYTE *)Parameter + 64) = 1;
  if( (*((_BYTE *)Parameter + 65) & 1) != 0 )
  {
    v43 = *((unsigned int *)Parameter + 26);
    if( (_DWORD)v43 )
    {
      v44 = *((_QWORD *)Parameter + 12) + v43;
      if( v44 <= v4 )
        *((_DWORD *)Parameter + 28) = 0;
      else
        v17 = v44;
    }
  }
  v18 = 0i64;
  if( PopThermalPollingMode )
  {
    v45 = *((unsigned int *)Parameter + 58);
    if( (_DWORD)v45 )
    {
      v46 = *((_QWORD *)Parameter + 30) + v45;
      if( v46 <= v4 )
      {
        *((_DWORD *)Parameter + 28) = 0;
        v17 = 0i64;
      }
      else if( !v17 || v17 >= v46 )
      {
        v17 = v46;
      }
    }
    if( !PopThermalPollingWakesAllowed )
    {
      *((_QWORD *)&v56 + 1) = -1i64;
      v18 = (_EXT_SET_PARAMETERS_V0 *)&v56;
    }
  }
  if( v17 )
    KeSetTimer2((_KTIMER2 *)((char *)Parameter + 296), v4 - v17, 0i64, v18);
LABEL_23:
  v1 = 92;
  v13 = (char *)Parameter + 112;
  v19 = 2703488i64;
LABEL_24:
  v10 = v1;
LABEL_25:
  LODWORD(OutputSize) = v1;
  LODWORD(BugCheckParameter4) = v10;
  PopPrepareIoctl(*((IRP **)Parameter + 7), v19, v9, v13, BugCheckParameter4, OutputSize);
  v20 = *(_QWORD *)(v5 + 184);
  *(_QWORD *)(v20 - 16) = PopThermalIrpComplete;
  *(_QWORD *)(v20 - 8) = Parameter;
  *(_BYTE *)(v20 - 69) = -32;
  IofCallDriver(v6, (PIRP)v5);
LABEL_26:
  PopReleaseRwLock((UINT64)v2);
}

Referenced by:

No references.