IopResourceRequirementsListToReqList

INT64 __fastcall IopResourceRequirementsListToReqList(INT64 a1, CHAR **a2){
  unsigned int *v2; 
  unsigned int v3; 
  unsigned int *v4; 
  unsigned int *v5; 
  int v6; 
  unsigned int *v7; 
  int v8; 
  int v9; 
  unsigned int *v10; 
  unsigned int *v11; 
  char v12; 
  char v13; 
  int v14; 
  int v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  unsigned int v19; 
  unsigned __int64 v20; 
  signed int v21; 
  unsigned int v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  unsigned int v25; 
  signed int v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned int v29; 
  UINT64 v30; 
  _QWORD *PoolWithTag; 
  _QWORD *v32; 
  unsigned int *v33; 
  INT64 *v34; 
  int v35; 
  unsigned int v36; 
  int v37; 
  _DWORD *v38; 
  __int64 v39; 
  unsigned int *v40; 
  __int64 v41; 
  INT64 *v42; 
  int *v43; 
  int v44; 
  INT64 *v45; 
  int i; 
  INT64 v47; 
  INT64 v48; 
  char v49; 
  bool v50; 
  char v51; 
  unsigned int v52; 
  int v53; 
  int v54; 
  bool v55; 
  int v57; 
  unsigned __int64 v58; 
  int v59; 
  unsigned int v60; 
  int v61; 
  int v62; 
  INT64 *v63; 
  INT64 v64; 
  int v65; 
  INT64 v66; 
  INT64 *v67; 
  INT64 *v68; 
  int v71; 
  unsigned int *v72; 
  int v73; 
  *a2 = 0i64;
  v2 = *(unsigned int **)(a1 + 24);
  v71 = 0;
  v72 = v2;
  v3 = v2[7];
  if( !v3 )
    return 0i64;
  v4 = (unsigned int *)((char *)v2 + *v2);
  v5 = v2 + 8;
  v6 = v3 - 1;
  v7 = v2 + 8;
  v8 = 0;
  v9 = 0;
  if( (int)(v3 - 1) >= 0 )
  {
    do
    {
      v10 = v7 + 2;
      v7 += 8 * v7[1] + 2;
      if( v10 == v7 )
        return 0i64;
      if( v10 > v7 || v10 > v4 || v7 > v4 )
        return 3221225485i64;
      if( *((_BYTE *)v10 + 1) == 0x80 )
        v10 += 8;
      v11 = v10;
LABEL_10:
      v12 = 1;
      while( v10 < v7 )
      {
        v13 = *((_BYTE *)v10 + 1);
        v14 = v8;
        if( (unsigned __int8)v13 == 128 )
          return 3221225485i64;
        if( *((unsigned __int8 *)v10 + 1) == 129 )
        {
          for( ; v10 < v7; v10 += 8 )
          {
            if( *((_BYTE *)v10 + 1) != 0x81 )
              break;
            if( v10 == v11 )
              return 3221225485i64;
            ++v8;
          }
          goto LABEL_10;
        }
        v15 = ++v8;
        if( v13 <= 0 )
        {
          v8 = v14;
          *(_BYTE *)v10 = 1;
          v10 += 8;
          if( v13 != -16 )
            v8 = v15;
          goto LABEL_10;
        }
        if( (*(_BYTE *)v10 & 8) != 0 )
        {
          if( v12 )
            return 3221225485i64;
          ++v9;
        }
        else
        {
          v12 = 0;
        }
        v10 += 8;
      }
      --v6;
    }
    while( v6 >= 0 );
    v3 = v2[7];
  }
  v16 = v8 - v9;
  v17 = -1073741823;
  v18 = 296i64 * v16;
  if( v18 > 0xFFFFFFFF )
    return 2147483653i64;
  if( v16 <= 1 )
  {
    v19 = 0;
    v21 = 0;
  }
  else
  {
    v19 = -1;
    v20 = 8i64 * (v16 - 1);
    if( v20 <= 0xFFFFFFFF )
      v19 = 8 * (v16 - 1);
    v21 = v20 > 0xFFFFFFFF ? 0xC0000095 : 0;
  }
  if( v21 < 0 )
    return 2147483653i64;
  v22 = -1;
  if( v19 + 32 >= v19 )
    v22 = v19 + 32;
  if( v19 + 32 < v19 )
    return 2147483653i64;
  v23 = 0xFFFFFFFFi64;
  v24 = v3 * (unsigned __int64)v22;
  if( v24 <= 0xFFFFFFFF )
    v23 = (unsigned int)v24;
  if( v24 > 0xFFFFFFFF )
    return 2147483653i64;
  if( v3 > 1 )
  {
    v25 = -1;
    v58 = 8i64 * (v3 - 1);
    if( v58 <= 0xFFFFFFFF )
      v25 = 8 * (v3 - 1);
    v26 = v58 > 0xFFFFFFFF ? 0xC0000095 : 0;
  }
  else
  {
    v25 = 0;
    v26 = 0;
  }
  if( v26 < 0 )
    return 2147483653i64;
  v27 = -1;
  if( v25 + 48 >= v25 )
    v27 = v25 + 48;
  if( v25 + 48 < v25 )
    return 2147483653i64;
  v28 = v23 + v27;
  if( (unsigned int)v23 + v27 < v27 )
    return 2147483653i64;
  v29 = v28 + v18;
  v30 = 0xFFFFFFFFi64;
  if( v28 + (unsigned int)v18 >= v28 )
    v30 = v29;
  if( v29 < v28 )
    return 2147483653i64;
  PoolWithTag = ExAllocatePoolWithTag(PagedPool, v30, 0x20207050ui64);
  v32 = PoolWithTag;
  if( !PoolWithTag )
    return 3221225626i64;
  memset((INT64)PoolWithTag, 0i64);
  v64 = (INT64)v32 + v27;
  memset(v64, 0i64);
  v66 = v23 + v64;
  memset(v23 + v64, 0i64);
  v33 = v72;
  v34 = v32 + 5;
  v63 = v32 + 5;
  v35 = v72[1];
  v36 = v72[2];
  if( v35 == -1 )
    v35 = 1;
  v60 = v72[2];
  v32[2] = 0i64;
  v32[1] = a1;
  *((_DWORD *)v32 + 1) = v36;
  v73 = v35;
  *(_DWORD *)v32 = v35;
  *((_DWORD *)v32 + 8) = v3;
  memset((INT64)(v32 + 5), 0i64);
  v37 = 0;
  v62 = v3 - 1;
  if( (int)(v3 - 1) < 0 )
    goto LABEL_71;
  do
  {
    v38 = (_DWORD *)v64;
    v68 = v34;
    v39 = v64;
    v40 = v5 + 2;
    v65 = v37;
    v41 = v5[1];
    v42 = (INT64 *)(v64 + 24);
    *v63 = v64;
    *(_DWORD *)(v64 + 16) = v37;
    v5 = &v40[8 * v41];
    ++v37;
    *(_QWORD *)(v64 + 8) = v32;
    *(_DWORD *)(v64 + 20) = 0;
    v64 += 24i64;
    ++v63;
    if( *((_BYTE *)v40 + 1) == 0x80 )
    {
      v43 = (int *)(v40 + 2);
      v40 += 8;
      v44 = *v43;
    }
    else
    {
      v44 = 12288;
    }
    *v38 = v44;
    v45 = v42;
    for( i = 0; ; i = v61 )
    {
      while( 1 )
      {
        if( v40 >= v5 )
        {
          v34 = v63;
          goto LABEL_70;
        }
        if( *((_BYTE *)v40 + 1) != 0xF0 )
          break;
        v59 = v40[2];
        if( v59 == -1 )
          v59 = 1;
        v60 = v40[3];
        v73 = v59;
LABEL_91:
        v40 += 8;
      }
      ++*(_DWORD *)(v39 + 20);
      v47 = v66;
      v48 = v66;
      *v45 = v66;
      v66 += 296i64;
      v67 = v45 + 1;
      *(_DWORD *)(v48 + 24) = i;
      *(_DWORD *)(v48 + 4) = v60;
      *(_QWORD *)(v48 + 16) = v39;
      *(_QWORD *)(v48 + 32) = v48;
      *(_DWORD *)(v48 + 276) = 0;
      *(_QWORD *)(v48 + 280) = 0i64;
      *(_DWORD *)v48 = v73;
      v49 = *((_BYTE *)v40 + 1);
      v61 = i + 1;
      v50 = v49 == 0;
      if( v49 < 0 || (v51 = 1, v50) )
        v51 = 0;
      *(_BYTE *)(v47 + 8) = v51;
      ++v42;
      *(_QWORD *)(v47 + 48) = v47 + 40;
      *(_QWORD *)(v47 + 40) = v47 + 40;
      *(_DWORD *)(v47 + 56) = 0;
      *(_QWORD *)(v47 + 64) = v40;
      *(_QWORD *)(v47 + 72) = *(_QWORD *)a1;
      *(_DWORD *)(v47 + 80) = *(_DWORD *)(a1 + 12);
      *(_QWORD *)(v47 + 88) = 0i64;
      *(_DWORD *)(v47 + 96) = v73;
      *(_DWORD *)(v47 + 100) = v33[3];
      v52 = v33[2];
      *(_DWORD *)(v47 + 128) = -1;
      *(_DWORD *)(v47 + 104) = v52;
      *(_QWORD *)(v47 + 112) = v47 + 136;
      v64 = (INT64)v42;
      *(_DWORD *)(v47 + 84) = 0;
      if( !*(_BYTE *)(v47 + 8) )
      {
        ++i;
        *(_BYTE *)(v48 + 136) = *((_BYTE *)v40 + 1);
        *(_BYTE *)(v47 + 137) = *((_BYTE *)v40 + 2);
        *(_WORD *)(v47 + 138) = *((_WORD *)v40 + 2);
        *(_DWORD *)(v47 + 140) = v40[2];
        *(_DWORD *)(v47 + 144) = v40[3];
        *(_DWORD *)(v47 + 148) = v40[4];
        v57 = v71;
        if( *((_BYTE *)v40 + 1) == 0x84 )
          v57 = 1;
        v71 = v57;
        v45 = v67;
        goto LABEL_91;
      }
      *(_BYTE *)(v48 + 136) = 8;
      v53 = ++*(_DWORD *)(v47 + 56);
      v71 = 1;
      while( 1 )
      {
        v40 += 8;
        if( v40 >= v5 )
          break;
        if( *((_BYTE *)v40 + 1) == 0x81 )
        {
          *(_QWORD *)(v47 + 280) = v40;
          while( v40 < v5 && *((_BYTE *)v40 + 1) == 0x81 )
          {
            ++*(_DWORD *)(v47 + 276);
            v40 += 8;
          }
          break;
        }
        if( (*(_BYTE *)v40 & 8) == 0 )
          break;
        *(_DWORD *)(v47 + 56) = ++v53;
      }
      v54 = IopSetupArbiterAndTranslators(v47);
      if( v54 < 0 )
        break;
      v42 = (INT64 *)v64;
      v45 = v67;
    }
    v34 = v68;
    --*((_DWORD *)v32 + 8);
    v37 = v65;
    v63 = v68;
    IopFreeReqAlternative(v39);
    v17 = v54;
LABEL_70:
    --v62;
  }
  while( v62 >= 0 );
LABEL_71:
  v55 = v37 == 0;
  if( !v37 )
  {
    IopFreeReqList(v32);
    v55 = 1;
  }
  if( !v55 )
    v17 = 0;
  if( !v17 )
  {
    if( v71 )
      *a2 = (CHAR *)v32;
    else
      IopFreeReqList(v32);
  }
  return v17;
}

Referenced by:

IopAllocateBootResourcesInternal
IopQueryConflictListInternal
PnpGetResourceRequirementsForAssignTable
PnpReleaseBootResourcesForFilteredRequirements
PnpRestoreResourcesInternal