PoFxAbandonDevice

VOID __stdcall PoFxAbandonDevice(_DEVICE_NODE *DevNode){
  signed __int32 v2; 
  signed __int32 v3; 
  _QWORD *Diagnostic; 
  signed __int32 PowerFlags; 
  signed __int32 v6; 
  _POP_FX_PLUGIN *Plugin; 

  _m_prefetchw((char *)&stru_140C23628 + 5048);
  v2 = *(&stru_140C23628 + 1262);
  do
  {
    v3 = v2;
    v2 = _InterlockedCompareExchange((_DWORD *)&stru_140C23628 + 1262, v2, v2);
  }
  while( v3 != v2 );
  if( (v2 & 1) != 0 )
  {
    ExAcquirePushLockExclusiveEx(&PopDirectedDripsDiagLock, 0i64);
    Diagnostic = DevNode->DirectedDripsState.Diagnostic;
    if( Diagnostic )
    {
      DevNode->DirectedDripsState.Diagnostic = 0i64;
      Diagnostic[2] = 0i64;
    }
    if( (_InterlockedExchangeAdd64(&PopDirectedDripsDiagLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&PopDirectedDripsDiagLock);
    KeAbPostRelease(&PopDirectedDripsDiagLock);
  }
  _m_prefetchw((const void *)&DevNode->PowerFlags);
  PowerFlags = DevNode->PowerFlags;
  do
  {
    v6 = PowerFlags;
    PowerFlags = _InterlockedCompareExchange(&DevNode->PowerFlags, PowerFlags, PowerFlags);
  }
  while( v6 != PowerFlags );
  if( (PowerFlags & 1) != 0 )
  {
    PopFxUnregisterDeviceOrWait(DevNode);
    Plugin = DevNode->Plugin;
    if( Plugin )
    {
      PopPluginAbandonDevice(DevNode->Plugin, &DevNode->UniqueId);
      Plugin = DevNode->Plugin;
    }
    PopDiagTraceFxDevicePreparation(DevNode, Plugin, &DevNode->UniqueId, 0);
    DevNode->Plugin = 0i64;
    _InterlockedAnd(&DevNode->PowerFlags, 0xFFFFFFFE);
  }
  _m_prefetchw((const void *)&DevNode->PowerFlags);
  if( (_InterlockedAnd(&DevNode->PowerFlags, 0xFFFFFFFD) & 2) != 0 )
    PopFxFreeUniqueId(DevNode);
}

Referenced by:

IopRemoveDevice
PnpDriverLoadingFailed