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