IopCheckIfMergeRequired

char __fastcall IopCheckIfMergeRequired(unsigned int **a1, int **a2){
  __int64 v4; 
  unsigned __int64 v5; 
  __int64 v6; 
  LIST_ENTRY *ProviderList; 
  LIST_ENTRY *Flink; 
  LIST_ENTRY **v9; 
  INT64 a3; 
  DEVICE_OBJECT *Provider; 
  UINT64 DependencyTypes; 
  int a2a; 
  int v15; 
  a3 = 0i64;
  Provider = 0i64;
  a2a = 0;
  v15 = 0;
LABEL_2:
  while( IopEnumerateRelations(a1, &a2a, &a3, 0i64, 0i64) )
  {
    if( PipIsDeviceInDeviceObjectList((INT64 *)*a2, a3, 0i64) )
      return 1;
    v5 = *(_QWORD *)(v4 + 16);
    if( !v5 )
      v5 = *(_QWORD *)(v4 + 648) & 0xFFFFFFFFFFFFFFFEui64;
    if( PipIsDeviceInDeviceObjectList((INT64 *)*a2, *(_QWORD *)(v5 + 32), 0i64) )
      return 1;
    ProviderList = PiGetProviderList(*(DEVICE_OBJECT **)(v6 + 32));
    Flink = ProviderList->Flink;
    if( ProviderList->Flink != ProviderList )
    {
      while( 1 )
      {
        PiEnumerateProviderListEntry(Flink, &Provider, &DependencyTypes);
        Flink = *v9;
        if( Provider )
        {
          if( PipIsDeviceInDeviceObjectList((INT64 *)*a2, (INT64)Provider, 0i64) )
            return 1;
        }
        if( Flink == ProviderList )
          goto LABEL_2;
      }
    }
  }
  return 0;
}

Referenced by:

PnpQueuePendingSurpriseRemoval