PopDeactiveThermalRequest

void __fastcall PopDeactiveThermalRequest(__int64 a1){
  _POP_COOLING_EXTENSION *v1; 
  char v3; 
  INT64 v4; 
  __int64 v5; 
  _QWORD *v6; 
  _DEVICE_OBJECT *DeviceObject; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  __int128 Object; 
  __int64 v11; 

  v1 = *(_POP_COOLING_EXTENSION **)(a1 + 32);
  Object = 0i64;
  v11 = 0i64;
  v3 = 0;
  PopAcquireRwLockExclusive(&v1->Lock);
  if( *(_BYTE *)(a1 + 18) )
  {
    if( v1->Interface.PassiveCooling )
    {
      PopThermalUpdatePassiveTimeTracking();
      PopTraceThermalRequestPassiveHistogram(a1);
      PopThermalUpdateTelemetryClientCount(0);
    }
    if( v1->Interface.ActiveCooling )
    {
      LOBYTE(v4) = *(_BYTE *)(a1 + 17) == 0;
      PopThermalUpdateActiveTimeTracking(a1 + 40, v4);
      PopTraceThermalRequestActiveActivity(a1);
    }
    PopDiagTraceThermalRequest(a1, POP_ETW_EVENT_THERMAL_REQUEST_REMOVE);
    *(_BYTE *)(a1 + 18) = 0;
    PopPropogateCoolingChange(v1);
  }
  PopReleaseRwLock(&v1->Lock);
  PopAcquireRwLockExclusive(&PopCoolingExtensionLock);
  PopAcquireRwLockExclusive(&v1->Lock);
  v5 = *(_QWORD *)a1;
  if( *(_QWORD *)(*(_QWORD *)a1 + 8i64) != a1 )
    goto LABEL_22;
  v6 = *(_QWORD **)(a1 + 8);
  if( *v6 != a1 )
    goto LABEL_22;
  *v6 = v5;
  *(_QWORD *)(v5 + 8) = v6;
  if( v1->RequestListHead.Flink != &v1->RequestListHead )
    goto LABEL_17;
  DeviceObject = v1->DeviceObject;
  if( DeviceObject )
  {
    PopGetDope(DeviceObject)->CoolingExtension = 0i64;
    if( v1->Enabled )
      PopDiagTraceCoolingExtension((__int64)v1, (const _EVENT_DESCRIPTOR *)POP_ETW_EVENT_COOLING_EXTENSION_REMOVE);
    Flink = v1->Link.Flink;
    if( (_POP_COOLING_EXTENSION *)v1->Link.Flink->Blink == v1 )
    {
      Blink = v1->Link.Blink;
      if( (_POP_COOLING_EXTENSION *)Blink->Flink == v1 )
      {
        Blink->Flink = Flink;
        Flink->Blink = Blink;
        v1->Link.Flink = 0i64;
        goto LABEL_16;
      }
    }
LABEL_22:
    __fastfail(3u);
  }
LABEL_16:
  v3 = 1;
LABEL_17:
  PopReleaseRwLock(&v1->Lock);
  PopReleaseRwLock(&PopCoolingExtensionLock);
  if( v3 )
  {
    PopAcquireRwLockExclusive(&v1->Lock);
    if( v1->UpdatingToCurrent )
    {
      KeInitializeEvent((INT64)&Object, 0, 0);
      v1->RemovalFlushEvent = (_KEVENT *)&Object;
      PopReleaseRwLock(&v1->Lock);
      KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
      PopAcquireRwLockExclusive(&v1->Lock);
      v1->RemovalFlushEvent = 0i64;
    }
    PopReleaseRwLock(&v1->Lock);
    PopCleanCoolingExtension(v1);
  }
}

Referenced by:

PoDeleteThermalRequest