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