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