PopOrphanCoolingExtension

VOID __stdcall PopOrphanCoolingExtension(_POP_COOLING_EXTENSION *CoolingExtension){
  INT64 v2; 
  _DEVICE_OBJECT *DeviceObject; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *Blink; 

  PopAcquireRwLockExclusive(&PopCoolingExtensionLock);
  PopAcquireRwLockExclusive(&CoolingExtension->Lock);
  DeviceObject = CoolingExtension->DeviceObject;
  if( DeviceObject )
  {
    Flink = CoolingExtension->RequestListHead.Flink;
    if( Flink != &CoolingExtension->RequestListHead )
    {
      do
      {
        if( BYTE2(Flink[1].Flink) )
        {
          BYTE2(Flink[1].Flink) = 0;
          if( CoolingExtension->Interface.PassiveCooling )
          {
            PopThermalUpdatePassiveTimeTracking();
            PopTraceThermalRequestPassiveHistogram((__int64)Flink);
            PopThermalUpdateTelemetryClientCount(0);
          }
          if( CoolingExtension->Interface.ActiveCooling )
          {
            LOBYTE(v2) = BYTE1(Flink[1].Flink) == 0;
            PopThermalUpdateActiveTimeTracking((INT64)&Flink[2].Blink, v2);
            PopTraceThermalRequestActiveActivity((INT64)Flink);
          }
          PopDiagTraceThermalRequest(Flink, POP_ETW_EVENT_THERMAL_REQUEST_REMOVE);
        }
        Flink = Flink->Flink;
      }
      while( Flink != &CoolingExtension->RequestListHead );
      DeviceObject = CoolingExtension->DeviceObject;
    }
    PopGetDope(DeviceObject)->CoolingExtension = 0i64;
    v5 = CoolingExtension->Link.Flink;
    if( (_POP_COOLING_EXTENSION *)CoolingExtension->Link.Flink->Blink != CoolingExtension
      || (Blink = CoolingExtension->Link.Blink, (_POP_COOLING_EXTENSION *)Blink->Flink != CoolingExtension) )
    {
      __fastfail(3u);
    }
    Blink->Flink = v5;
    v5->Blink = Blink;
    CoolingExtension->Link.Flink = 0i64;
    CoolingExtension->DeviceObject = 0i64;
  }
  PopReleaseRwLock(&CoolingExtension->Lock);
  PopReleaseRwLock(&PopCoolingExtensionLock);
}

Referenced by:

PopCoolingExtensionPnpNotification