PopGetDope

_DEVICE_OBJECT_POWER_EXTENSION *__stdcall PopGetDope(DEVICE_OBJECT *DeviceObject){
  __int64 v1; 
  _QWORD *PoolWithTag; 
  _QWORD *v4; 
  UINT64 v5; 
  unsigned __int8 v6; 
  unsigned __int64 v7; 
  v1 = *((_QWORD *)DeviceObject + 39);
  if( !*(_QWORD *)(v1 + 24) )
  {
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x60ui64, 0x45504F44ui64);
    v4 = PoolWithTag;
    if( PoolWithTag )
    {
      memset((INT64)PoolWithTag, 0i64);
      v4[3] = DeviceObject;
      v4[5] = v4 + 4;
      v4[4] = v4 + 4;
      KeAcquireSpinLockRaiseToDpc(&PopDopeGlobalLock, v5);
      v7 = v6;
      if( !*(_QWORD *)(v1 + 24) )
      {
        *(_QWORD *)(v1 + 24) = v4;
        v4 = 0i64;
      }
      KxReleaseSpinLock(&PopDopeGlobalLock);
      __writecr8(v7);
      if( v4 )
        ExFreePoolWithTag(v4, 0x45504F44u);
    }
  }
  return *(_DEVICE_OBJECT_POWER_EXTENSION **)(v1 + 24);
}

Referenced by:

PoRegisterDeviceForIdleDetection
PopAssociateThermalRequest
PopDeactiveThermalRequest
PopOrphanCoolingExtension