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