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; 
  struct _KEVENT Event; 
  v1 = *(_POP_COOLING_EXTENSION **)(a1 + 32);
  memset(&Event, 0, sizeof(Event));
  v3 = 0;
  PopAcquireRwLockExclusive(&v1->Lock);
  if( *(_BYTE *)(a1 + 18) )
  {
    if( v1->Interface.PassiveCooling )
    {
      PopThermalUpdatePassiveTimeTracking((_POP_THERMAL_TELEMETRY_TRACKER *)(a1 + 40), *(_BYTE *)(a1 + 16));
      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((__int64)v1);
  }
  PopReleaseRwLock((UINT64)&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 )
  {
    *((_QWORD *)PopGetDope(DeviceObject) + 8) = 0i64;
    if( v1->Enabled )
      PopDiagTraceCoolingExtension(v1, (_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((UINT64)&v1->Lock);
  PopReleaseRwLock((UINT64)&PopCoolingExtensionLock);
  if( v3 )
  {
    PopAcquireRwLockExclusive(&v1->Lock);
    if( v1->UpdatingToCurrent )
    {
      KeInitializeEvent(&Event, NotificationEvent, 0);
      v1->RemovalFlushEvent = &Event;
      PopReleaseRwLock((UINT64)&v1->Lock);
      KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
      PopAcquireRwLockExclusive(&v1->Lock);
      v1->RemovalFlushEvent = 0i64;
    }
    PopReleaseRwLock((UINT64)&v1->Lock);
    PopCleanCoolingExtension(v1);
  }
}

Referenced by:

PoDeleteThermalRequest