PopFxLockDevice
_POP_FX_DEVICE *__stdcall PopFxLockDevice(_DEVICE_NODE *DevNode, UINT8 LockStartedOnly){
unsigned __int64 FxDevice;
unsigned __int8 v5;
unsigned __int64 v6;
UINT64 RemlockSize;
FxDevice = 0i64;
if( DevNode )
{
v5 = ExAcquireSpinLockShared((INT64 *)&DevNode->FxDeviceLock);
FxDevice = (unsigned __int64)DevNode->FxDevice;
v6 = v5;
if( LockStartedOnly )
{
_m_prefetchw((const void *)&DevNode->PowerFlags);
FxDevice &= -(__int64)((_InterlockedOr(&DevNode->PowerFlags, 0) & 4) != 0);
}
if( FxDevice )
{
LODWORD(RemlockSize) = 32;
if( IoAcquireRemoveLockEx((_IO_REMOVE_LOCK *)(FxDevice + 240), 0i64, (CHAR *)&File, 1ui64, RemlockSize) < 0 )
FxDevice = 0i64;
}
ExReleaseSpinLockSharedFromDpcLevel(&DevNode->FxDeviceLock);
__writecr8(v6);
}
return(_POP_FX_DEVICE *)FxDevice;
}Referenced by:
PoFxNotifySurprisePowerOn
PopAllocateIrp
PopFxUnregisterDeviceOrWait