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