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