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