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