IopQueryConflictListInternal

__int64 __fastcall IopQueryConflictListInternal(
        _DEVICE_OBJECT *PhysicalDeviceObject,
        __int64 a2,
        __int64 a3,
        _DWORD *a4,
        unsigned int a5){
  _DWORD *DeviceNode; 
  int ConflictFillConflicts; 
  int v10; 
  __int64 v11; 
  int v12; 
  int v13; 
  VOID **v14; 
  VOID **v15; 
  __int64 v16; 
  __int64 v17; 
  _PI_RESOURCE_ARBITER_ENTRY *v18; 
  __int64 v19; 
  char v20; 
  NTSTATUS v21; 
  unsigned int v23; 
  PVOID P; 
  VOID *ResReqList; 
  PNP_RESOURCE_REQUEST Request[16]; 
  __int128 Input1; 
  __int128 v28; 

  v23 = 0;
  P = 0i64;
  Input1 = 0i64;
  v28 = 0i64;
  memset(Request, 0i64, sizeof(Request));
  ResReqList = 0i64;
  a4[2] = 0;
  a4[3] = 0;
  a4[4] = 32;
  if( PhysicalDeviceObject )
    DeviceNode = PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
  else
    DeviceNode = 0i64;
  if( !DeviceNode )
    return(unsigned int)-1073741810;
  if( *(_BYTE *)(a2 + 20) == 1 )
    goto LABEL_12;
  if( *(_BYTE *)(a2 + 20) != 2 )
  {
    if( *(_BYTE *)(a2 + 20) == 3 )
    {
LABEL_12:
      if( !*(_DWORD *)(a2 + 32) )
        return 0;
      goto LABEL_14;
    }
    if( *(_BYTE *)(a2 + 20) != 4 )
    {
      if( *(_BYTE *)(a2 + 20) != 7 )
        return(unsigned int)-1073741811;
      goto LABEL_12;
    }
  }
LABEL_14:
  v10 = DeviceNode[114];
  v11 = *((_QWORD *)DeviceNode + 55);
  if( v10 == -1 )
  {
    if( !v11 || (v10 = *(_DWORD *)(v11 + 4), v10 == -1) )
      v10 = 1;
  }
  v12 = v10;
  if( v10 == 8 )
    v12 = 1;
  *(_DWORD *)(a2 + 4) = v12;
  v13 = DeviceNode[115];
  if( v13 == -1 )
  {
    if( !v11 || (v13 = *(_DWORD *)(v11 + 8), v13 == -1) )
      v13 = 0;
  }
  *(_DWORD *)(a2 + 8) = v13;
  v14 = PnpCmResourcesToIoResources(0xFFFFFFFFi64, (_DWORD *)a2, 0);
  v15 = v14;
  if( v14 )
  {
    Request[3] = -1;
    *(_QWORD *)Request = PhysicalDeviceObject;
    *(_QWORD *)&Request[6] = v14;
    ConflictFillConflicts = IopResourceRequirementsListToReqList(Request, &ResReqList);
    if( ConflictFillConflicts >= 0 )
    {
      if( ResReqList
        && (v16 = *((_QWORD *)ResReqList + 5),
            *((_QWORD *)ResReqList + 2) = (char *)ResReqList + 40,
            *(_DWORD *)(v16 + 20) == 1)
        && (v17 = *(_QWORD *)(v16 + 24), *(_BYTE *)(v17 + 8)) )
      {
        v18 = *(_PI_RESOURCE_ARBITER_ENTRY **)(v17 + 288);
        v19 = *(_QWORD *)(*(_QWORD *)(v17 + 32) + 64i64);
        v20 = *(_BYTE *)(v19 + 1);
        if( v20 == (char)0x80 || v20 == -16 )
          v19 += 32i64;
        *((_QWORD *)&Input1 + 1) = v19;
        *(_QWORD *)&v28 = &v23;
        *(_QWORD *)&Input1 = PhysicalDeviceObject;
        *((_QWORD *)&v28 + 1) = &P;
        v21 = IopCallArbiter(v18, ArbiterActionQueryConflict, &Input1);
        ConflictFillConflicts = v21;
        if( v21 < 0 )
        {
          if( v21 == -1073741172 )
            ConflictFillConflicts = IopQueryConflictFillConflicts(0i64, 0, 0i64, (__int64)a4, a5, 4);
        }
        else
        {
          ConflictFillConflicts = IopQueryConflictFillConflicts(PhysicalDeviceObject, v23, P, (__int64)a4, a5, 0);
          if( P )
            ExFreePoolWithTag(P, 0);
        }
      }
      else
      {
        ConflictFillConflicts = -1073741811;
      }
    }
    ExFreePoolWithTag(v15, 0);
  }
  else
  {
    ConflictFillConflicts = -1073741811;
  }
  if( ResReqList )
    IopFreeReqList((_REQ_LIST *)ResReqList);
  return(unsigned int)ConflictFillConflicts;
}

Referenced by:

IopQueryConflictList