PnpIsChainDereferenced
__int64 __fastcall PnpIsChainDereferenced(PDEVICE_OBJECT *a1, INT64 a2, INT64 a3, __int64 a4, __int64 *a5){
__int64 *v5;
int v6;
int v7;
__int64 v9;
unsigned int v10;
UINT8 v11;
__int64 v12;
int v13;
UINT8 v14;
PDEVICE_OBJECT *v15;
UINT8 v16;
unsigned int v17;
__int64 v18;
__int64 v19;
__int64 *v20;
INT64 v21;
INT64 v22;
INT64 v23;
__int64 *v25;
__int64 v26;
__int64 v27[9];
int v28;
v28 = a4;
v5 = a5;
v6 = a3;
v7 = a2;
if( a5 )
*a5 = 0i64;
v9 = 0i64;
v10 = 0;
v11 = KeAcquireQueuedSpinLock(10i64, a2, a3);
v13 = 0;
v14 = v11;
if( v7 > 0 )
{
v15 = a1;
v16 = v11;
while( 1 )
{
v27[0] = 0i64;
LOBYTE(v17) = PnpIsAnyDeviceInUse((__int64 *)&a1[v13], v12, v27);
v10 = v17;
PnpUpdateExtensionFlags(v20, v18, v19, 1);
if( v6 )
{
if( v10 )
{
LABEL_9:
v5 = a5;
v14 = v16;
v9 = v27[0];
break;
}
}
else if( !v10 )
{
KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v16);
PnpChainDereferenceComplete(*v15, v28, v21);
v16 = KeAcquireQueuedSpinLock(10i64, v22, v23);
}
++v13;
++v15;
if( v13 >= v7 )
goto LABEL_9;
}
}
if( v6 && v10 )
{
if( v5 )
*v5 = v9;
if( v13 >= 0 )
{
v25 = (__int64 *)&a1[v13];
do
{
PnpUpdateExtensionFlags(v25, v12, (__int64)v25, 0);
v25 = (__int64 *)(v26 - 8);
--v13;
}
while( v13 >= 0 );
}
}
KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v14);
if( !v6 )
return 1;
return v10;
}Referenced by:
PipEventRemovalCheckOpenHandles
PnpProcessQueryRemoveAndEject