PnpIsChainDereferenced
VOID __fastcall PnpIsChainDereferenced(
_DEVICE_OBJECT **DeviceObjects,
UINT64 Count,
UINT64 Query,
UINT64 CleanStack,
_DEVICE_OBJECT **VetoingDevice){
_DEVICE_OBJECT **v5;
int v6;
int v7;
int IsAnyDeviceInUse;
UINT8 v10;
DEVICE_OBJECT **v11;
int v12;
KIRQL v13;
_DEVICE_OBJECT **v14;
KIRQL v15;
UINT64 v16;
DEVICE_OBJECT **v17;
INT64 v18;
INT64 v19;
DEVICE_OBJECT **v20;
__int64 v21;
unsigned int OnCleanStack;
OnCleanStack = CleanStack;
v5 = VetoingDevice;
v6 = Query;
v7 = Count;
if( VetoingDevice )
*VetoingDevice = 0i64;
IsAnyDeviceInUse = 0;
v10 = KeAcquireQueuedSpinLock(0xAui64);
v12 = 0;
v13 = v10;
if( v7 > 0 )
{
v14 = DeviceObjects;
v15 = v10;
while( 1 )
{
IsAnyDeviceInUse = PnpIsAnyDeviceInUse(&DeviceObjects[v12], v11);
PnpUpdateExtensionFlags(v17, v16);
if( v6 )
{
if( IsAnyDeviceInUse )
{
LABEL_9:
v5 = VetoingDevice;
v13 = v15;
break;
}
}
else if( !IsAnyDeviceInUse )
{
KeReleaseQueuedSpinLock(0xAui64, v15);
PnpChainDereferenceComplete(*v14, OnCleanStack, v18, v19);
v15 = KeAcquireQueuedSpinLock(0xAui64);
}
++v12;
++v14;
if( v12 >= v7 )
goto LABEL_9;
}
}
if( v6 && IsAnyDeviceInUse )
{
if( v5 )
*v5 = 0i64;
if( v12 >= 0 )
{
v20 = &DeviceObjects[v12];
do
{
PnpUpdateExtensionFlags(v20, (UINT64)v11);
v20 = (DEVICE_OBJECT **)(v21 - 8);
--v12;
}
while( v12 >= 0 );
}
}
KeReleaseQueuedSpinLock(0xAui64, v13);
}Referenced by:
PipEventRemovalCheckOpenHandles
PnpProcessQueryRemoveAndEject