PoFxAbandonDevice

void __fastcall PoFxAbandonDevice(_DEVICE_NODE *DevNode){
  signed __int32 v2; 
  signed __int32 v3; 
  __int64 v4; 
  signed __int32 v5; 
  signed __int32 v6; 
  void *v7; 
  INT64 v8; 
  _m_prefetchw(&PopDirectedDripsState);
  v2 = PopDirectedDripsState;
  do
  {
    v3 = v2;
    v2 = _InterlockedCompareExchange((volatile signed __int32 *)&PopDirectedDripsState, v2, v2);
  }
  while( v3 != v2 );
  if( (v2 & 1) != 0 )
  {
    ExAcquirePushLockExclusiveEx((UINT64)&PopDirectedDripsDiagLock, 0i64);
    v4 = *((_QWORD *)DevNode + 97);
    if( v4 )
    {
      *((_QWORD *)DevNode + 97) = 0i64;
      *(_QWORD *)(v4 + 16) = 0i64;
    }
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&PopDirectedDripsDiagLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&PopDirectedDripsDiagLock);
    KeAbPostRelease(&PopDirectedDripsDiagLock);
  }
  _m_prefetchw((char *)DevNode + 296);
  v5 = *((_DWORD *)DevNode + 74);
  do
  {
    v6 = v5;
    v5 = _InterlockedCompareExchange((volatile signed __int32 *)DevNode + 74, v5, v5);
  }
  while( v6 != v5 );
  if( (v5 & 1) != 0 )
  {
    PopFxUnregisterDeviceOrWait(DevNode);
    v7 = (void *)*((_QWORD *)DevNode + 18);
    if( v7 )
    {
      PopPluginAbandonDevice(*((_QWORD *)DevNode + 18), (__int64)DevNode + 128);
      v7 = (void *)*((_QWORD *)DevNode + 18);
    }
    PopDiagTraceFxDevicePreparation(DevNode, v7, (UNICODE_STRING *)DevNode + 8, 0, v8);
    *((_QWORD *)DevNode + 18) = 0i64;
    _InterlockedAnd((volatile signed __int32 *)DevNode + 74, 0xFFFFFFFE);
  }
  _m_prefetchw((char *)DevNode + 296);
  if( (_InterlockedAnd((volatile signed __int32 *)DevNode + 74, 0xFFFFFFFD) & 2) != 0 )
    PopFxFreeUniqueId((__int64)DevNode);
}

Referenced by:

IopRemoveDevice
PnpDriverLoadingFailed