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