PopAssociateThermalRequest
INT64 __fastcall PopAssociateThermalRequest(INT64 a1, INT64 a2, CHAR a3){
_POP_COOLING_EXTENSION *v6;
_DEVICE_OBJECT_POWER_EXTENSION *Dope;
_POP_COOLING_EXTENSION *PoolWithTag;
int v9;
_POP_COOLING_EXTENSION **v10;
__int64 v11;
__int64 v12;
INT64 *v13;
__int64 v14;
v6 = 0i64;
Dope = PopGetDope((DEVICE_OBJECT *)a2);
if( !Dope )
return(unsigned int)-1073741670;
PopAcquireRwLockExclusive(&PopCoolingExtensionLock);
if( *((_QWORD *)Dope + 8) )
goto LABEL_9;
PopReleaseRwLock((UINT64)&PopCoolingExtensionLock);
PoolWithTag = (_POP_COOLING_EXTENSION *)ExAllocatePoolWithTag(PagedPool, 0x90ui64, 0x6C6F4350ui64);
v6 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
memset((INT64)PoolWithTag, 0i64);
v6->RequestListHead.Blink = &v6->RequestListHead;
v6->RequestListHead.Flink = &v6->RequestListHead;
v6->Lock.Thread = 0i64;
v6->Lock.Lock.Value = 0i64;
v6->ThrottleLimit = 100;
v6->DeviceObject = (_DEVICE_OBJECT *)a2;
v9 = PopAcquireCoolingInterface((INT64)v6);
if( v9 >= 0 )
{
v6->Enabled = 1;
if( !a3 || (v9 = PopRegisterCoolingExtensionProtection(v6), v9 >= 0) )
{
PopAcquireRwLockExclusive(&PopCoolingExtensionLock);
if( !*((_QWORD *)Dope + 8) )
{
v10 = (_POP_COOLING_EXTENSION **)qword_140C23098;
if( *(_POP_COOLING_EXTENSION ***)qword_140C23098 != &PopCoolingExtensionList )
goto LABEL_24;
v6->Link.Flink = (_LIST_ENTRY *)&PopCoolingExtensionList;
v6->Link.Blink = (_LIST_ENTRY *)v10;
*v10 = v6;
qword_140C23098 = (__int64)v6;
*((_QWORD *)Dope + 8) = v6;
PopDiagTraceCoolingExtension(v6, (_EVENT_DESCRIPTOR *)&POP_ETW_EVENT_COOLING_EXTENSION_ADD);
v6 = 0i64;
a3 = 0;
}
LABEL_9:
if( a3 )
{
v9 = PopRegisterCoolingExtensionProtection(*((PVOID *)Dope + 8));
if( v9 < 0 )
{
PopReleaseRwLock((UINT64)&PopCoolingExtensionLock);
goto LABEL_16;
}
}
PopAcquireRwLockExclusive((_POP_RW_LOCK *)(*((_QWORD *)Dope + 8) + 32i64));
v11 = *((_QWORD *)Dope + 8);
*(_QWORD *)(a1 + 32) = v11;
v12 = v11 + 16;
v13 = *(INT64 **)(v12 + 8);
if( *v13 == v12 )
{
*(_QWORD *)(a1 + 8) = v13;
*(_QWORD *)a1 = v12;
*v13 = a1;
*(_QWORD *)(v12 + 8) = a1;
*(_BYTE *)(a1 + 18) = 1;
PopDiagTraceThermalRequest(a1, POP_ETW_EVENT_THERMAL_REQUEST_ADD);
v14 = *(_QWORD *)(a1 + 32);
if( *(_QWORD *)(v14 + 136) )
{
PopThermalUpdateTelemetryClientCount(1u);
v14 = *(_QWORD *)(a1 + 32);
}
if( *(_QWORD *)(v14 + 128) )
*(_BYTE *)(a1 + 41) = 1;
PopReleaseRwLock(*((_QWORD *)Dope + 8) + 32i64);
PopReleaseRwLock((UINT64)&PopCoolingExtensionLock);
v9 = 0;
goto LABEL_16;
}
LABEL_24:
__fastfail(3u);
}
}
LABEL_16:
if( v6 )
PopCleanCoolingExtension(v6);
return(unsigned int)v9;
}Referenced by:
PoCreateThermalRequest