PopPropogateCoolingChange

VOID __stdcall PopPropogateCoolingChange(_POP_COOLING_EXTENSION *CoolingExtension){
  unsigned __int8 v2; 
  unsigned __int8 v3; 
  _LIST_ENTRY *i; 
  unsigned __int8 Flink; 
  __int64 v6; 
  _KEVENT *PnpFlushEvent; 
  _KEVENT *RemovalFlushEvent; 

  if( CoolingExtension->UpdatingToCurrent )
  {
    CoolingExtension->UpdatingToCurrent = 0;
    return;
  }
  do
  {
    while( 1 )
    {
      v2 = 0;
      v3 = 100;
      if( CoolingExtension->Enabled )
      {
        for( i = CoolingExtension->RequestListHead.Flink; i != &CoolingExtension->RequestListHead; i = i->Flink )
        {
          if( BYTE2(i[1].Flink) )
          {
            Flink = (unsigned __int8)i[1].Flink;
            if( Flink >= v3 )
              Flink = v3;
            v3 = Flink;
            if( BYTE1(i[1].Flink) )
              v2 = 1;
          }
        }
      }
      if( v3 == CoolingExtension->ThrottleLimit )
        break;
      CoolingExtension->ThrottleLimit = v3;
      CoolingExtension->UpdatingToCurrent = 1;
      PopReleaseRwLock(&CoolingExtension->Lock);
      PopDiagTraceCoolingExtensionPassiveUpdate(CoolingExtension);
      CoolingExtension->Interface.PassiveCooling(CoolingExtension->Interface.Context, v3);
      PopAcquireRwLockExclusive(&CoolingExtension->Lock);
      if( CoolingExtension->UpdatingToCurrent )
      {
        CoolingExtension->UpdatingToCurrent = 0;
        break;
      }
    }
    if( v2 == CoolingExtension->ActiveEngaged )
      goto LABEL_15;
    CoolingExtension->ActiveEngaged = v2;
    CoolingExtension->UpdatingToCurrent = 1;
    PopReleaseRwLock(&CoolingExtension->Lock);
    PopDiagTraceCoolingExtensionActiveUpdate(CoolingExtension);
    LOBYTE(v6) = v2;
    CoolingExtension->Interface.ActiveCooling(CoolingExtension->Interface.Context, v6);
    PopAcquireRwLockExclusive(&CoolingExtension->Lock);
  }
  while( !CoolingExtension->UpdatingToCurrent );
  CoolingExtension->UpdatingToCurrent = 0;
LABEL_15:
  PnpFlushEvent = CoolingExtension->PnpFlushEvent;
  if( PnpFlushEvent )
    KeSetEvent(PnpFlushEvent, 0, 0);
  RemovalFlushEvent = CoolingExtension->RemovalFlushEvent;
  if( RemovalFlushEvent )
    KeSetEvent(RemovalFlushEvent, 0, 0);
}

Referenced by:

PoSetThermalActiveCooling
PoSetThermalPassiveCooling
PopCoolingExtensionPnpNotification
PopDeactiveThermalRequest
PopDisableCoolingExtension