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