IopResourceRequirementsListToReqList

NTSTATUS __stdcall IopResourceRequirementsListToReqList(PNP_RESOURCE_REQUEST *Request, VOID **ResReqList){
  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; 
  NTSTATUS 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; 
  size_t v31; 
  VOID **PoolWithTag; 
  VOID **v33; 
  unsigned int *v34; 
  _REQ_ALTERNATIVE **v35; 
  int v36; 
  unsigned int v37; 
  _REQ_ALTERNATIVE v38; 
  _REQ_ALTERNATIVE *v39; 
  _REQ_ALTERNATIVE *v40; 
  unsigned int *v41; 
  __int64 v42; 
  _REQ_ALTERNATIVE *v43; 
  int *v44; 
  int v45; 
  _REQ_DESC **v46; 
  _REQ_DESC i; 
  _REQ_DESC *v48; 
  _REQ_DESC *v49; 
  char v50; 
  bool v51; 
  char v52; 
  _REQ_DESC v53; 
  _REQ_DESC v54; 
  NTSTATUS v55; 
  bool v56; 
  int v58; 
  unsigned __int64 v59; 
  int v60; 
  unsigned int v61; 
  _REQ_DESC v62; 
  int v63; 
  _REQ_ALTERNATIVE **v64; 
  _REQ_ALTERNATIVE *ReqAlternative; 
  _REQ_ALTERNATIVE v66; 
  _REQ_DESC *ReqDesc; 
  _REQ_DESC **v68; 
  _REQ_ALTERNATIVE **v69; 
  int v72; 
  unsigned int *v73; 
  int v74; 

  *ResReqList = 0i64;
  v2 = (unsigned int *)*((_QWORD *)Request + 3);
  v72 = 0;
  v73 = v2;
  v3 = v2[7];
  if( !v3 )
    return 0;
  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 0;
      if( v10 > v7 || v10 > v4 || v7 > v4 )
        return -1073741811;
      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 -1073741811;
        if( *((unsigned __int8 *)v10 + 1) == 129 )
        {
          for( ; v10 < v7; v10 += 8 )
          {
            if( *((_BYTE *)v10 + 1) != 0x81 )
              break;
            if( v10 == v11 )
              return -1073741811;
            ++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 -1073741811;
          ++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 -2147483643;
  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 -2147483643;
  v22 = -1;
  if( v19 + 32 >= v19 )
    v22 = v19 + 32;
  if( v19 + 32 < v19 )
    return -2147483643;
  v23 = 0xFFFFFFFFi64;
  v24 = v3 * (unsigned __int64)v22;
  if( v24 <= 0xFFFFFFFF )
    v23 = (unsigned int)v24;
  if( v24 > 0xFFFFFFFF )
    return -2147483643;
  if( v3 > 1 )
  {
    v25 = -1;
    v59 = 8i64 * (v3 - 1);
    if( v59 <= 0xFFFFFFFF )
      v25 = 8 * (v3 - 1);
    v26 = v59 > 0xFFFFFFFF ? 0xC0000095 : 0;
  }
  else
  {
    v25 = 0;
    v26 = 0;
  }
  if( v26 < 0 )
    return -2147483643;
  v27 = -1;
  if( v25 + 48 >= v25 )
    v27 = v25 + 48;
  if( v25 + 48 < v25 )
    return -2147483643;
  v28 = v23 + v27;
  if( (unsigned int)v23 + v27 < v27 )
    return -2147483643;
  v29 = v28 + v18;
  v30 = 0xFFFFFFFFi64;
  if( v28 + (unsigned int)v18 >= v28 )
    v30 = v29;
  if( v29 < v28 )
    return -2147483643;
  v31 = v30;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v30, 538996816i64);
  v33 = PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  memset(PoolWithTag, 0i64, v31);
  ReqAlternative = (_REQ_ALTERNATIVE *)((char *)v33 + v27);
  memset(ReqAlternative, 0i64, v23);
  ReqDesc = (_REQ_ALTERNATIVE *)((char *)ReqAlternative + v23);
  memset((char *)ReqAlternative + v23, 0i64, v18);
  v34 = v73;
  v35 = (_REQ_ALTERNATIVE **)(v33 + 5);
  v64 = (_REQ_ALTERNATIVE **)(v33 + 5);
  v36 = v73[1];
  v37 = v73[2];
  if( v36 == -1 )
    v36 = 1;
  v61 = v73[2];
  v33[2] = 0i64;
  v33[1] = Request;
  *((_DWORD *)v33 + 1) = v37;
  v74 = v36;
  *(_DWORD *)v33 = v36;
  *((_DWORD *)v33 + 8) = v3;
  memset(v33 + 5, 0i64, 8 * v3);
  v38 = 0;
  v63 = v3 - 1;
  if( (int)(v3 - 1) < 0 )
    goto LABEL_71;
  do
  {
    v39 = ReqAlternative;
    v69 = v35;
    v40 = ReqAlternative;
    v41 = v5 + 2;
    v66 = v38;
    v42 = v5[1];
    v43 = ReqAlternative + 6;
    *v64 = ReqAlternative;
    ReqAlternative[4] = v38;
    v5 = &v41[8 * v42];
    ++v38;
    *((_QWORD *)ReqAlternative + 1) = v33;
    ReqAlternative[5] = 0;
    ReqAlternative += 6;
    ++v64;
    if( *((_BYTE *)v41 + 1) == 0x80 )
    {
      v44 = (int *)(v41 + 2);
      v41 += 8;
      v45 = *v44;
    }
    else
    {
      v45 = 12288;
    }
    *v39 = v45;
    v46 = (_REQ_DESC **)v43;
    for( i = 0; ; i = v62 )
    {
      while( 1 )
      {
        if( v41 >= v5 )
        {
          v35 = v64;
          goto LABEL_70;
        }
        if( *((_BYTE *)v41 + 1) != 0xF0 )
          break;
        v60 = v41[2];
        if( v60 == -1 )
          v60 = 1;
        v61 = v41[3];
        v74 = v60;
LABEL_91:
        v41 += 8;
      }
      ++v40[5];
      v48 = ReqDesc;
      v49 = ReqDesc;
      *v46 = ReqDesc;
      ReqDesc += 74;
      v68 = v46 + 1;
      v49[6] = i;
      v49[1] = v61;
      *((_QWORD *)v49 + 2) = v40;
      *((_QWORD *)v49 + 4) = v49;
      v49[69] = 0;
      *((_QWORD *)v49 + 35) = 0i64;
      *v49 = v74;
      v50 = *((_BYTE *)v41 + 1);
      v62 = i + 1;
      v51 = v50 == 0;
      if( v50 < 0 || (v52 = 1, v51) )
        v52 = 0;
      *((_BYTE *)v48 + 8) = v52;
      v43 += 2;
      *((_QWORD *)v48 + 6) = v48 + 10;
      *((_QWORD *)v48 + 5) = v48 + 10;
      v48[14] = 0;
      *((_QWORD *)v48 + 8) = v41;
      *((_QWORD *)v48 + 9) = *(_QWORD *)Request;
      v48[20] = Request[3];
      *((_QWORD *)v48 + 11) = 0i64;
      v48[24] = v74;
      v48[25] = v34[3];
      v53 = v34[2];
      v48[32] = -1;
      v48[26] = v53;
      *((_QWORD *)v48 + 14) = v48 + 34;
      ReqAlternative = v43;
      v48[21] = 0;
      if( !*((_BYTE *)v48 + 8) )
      {
        ++i;
        *((_BYTE *)v49 + 136) = *((_BYTE *)v41 + 1);
        *((_BYTE *)v48 + 137) = *((_BYTE *)v41 + 2);
        *((_WORD *)v48 + 69) = *((_WORD *)v41 + 2);
        v48[35] = v41[2];
        v48[36] = v41[3];
        v48[37] = v41[4];
        v58 = v72;
        if( *((_BYTE *)v41 + 1) == 0x84 )
          v58 = 1;
        v72 = v58;
        v46 = v68;
        goto LABEL_91;
      }
      *((_BYTE *)v49 + 136) = 8;
      v54 = ++v48[14];
      v72 = 1;
      while( 1 )
      {
        v41 += 8;
        if( v41 >= v5 )
          break;
        if( *((_BYTE *)v41 + 1) == 0x81 )
        {
          *((_QWORD *)v48 + 35) = v41;
          while( v41 < v5 && *((_BYTE *)v41 + 1) == 0x81 )
          {
            ++v48[69];
            v41 += 8;
          }
          break;
        }
        if( (*(_BYTE *)v41 & 8) == 0 )
          break;
        v48[14] = ++v54;
      }
      v55 = IopSetupArbiterAndTranslators(v48);
      if( v55 < 0 )
        break;
      v43 = ReqAlternative;
      v46 = v68;
    }
    v35 = v69;
    --*((_DWORD *)v33 + 8);
    v38 = v66;
    v64 = v69;
    IopFreeReqAlternative(v40);
    v17 = v55;
LABEL_70:
    --v63;
  }
  while( v63 >= 0 );
LABEL_71:
  v56 = v38 == 0;
  if( !v38 )
  {
    IopFreeReqList((_REQ_LIST *)v33);
    v56 = 1;
  }
  if( !v56 )
    v17 = 0;
  if( !v17 )
  {
    if( v72 )
      *ResReqList = v33;
    else
      IopFreeReqList((_REQ_LIST *)v33);
  }
  return v17;
}

Referenced by:

IopAllocateBootResourcesInternal
IopQueryConflictListInternal
PnpGetResourceRequirementsForAssignTable
PnpReleaseBootResourcesForFilteredRequirements
PnpRestoreResourcesInternal