PnpCmResourcesToIoResources

VOID **__fastcall PnpCmResourcesToIoResources(__int64 a1, _DWORD *a2, int a3){
  unsigned int v3; 
  int *v4; 
  unsigned int v5; 
  int v8; 
  _DWORD *v9; 
  __int64 v10; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned int v14; 
  __int64 v15; 
  VOID **PoolWithTag; 
  VOID **v17; 
  int v18; 
  VOID **v19; 
  int v20; 
  _DWORD *v21; 
  unsigned int v22; 
  int v23; 
  VOID **result; 
  ULONGLONG v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  int v28; 
  int v29; 
  unsigned __int64 Start; 

  v3 = *a2;
  v4 = a2 + 1;
  v5 = 0;
  v8 = 0;
  v9 = a2 + 1;
  if( !*a2 )
    return 0i64;
  v10 = v3;
  do
  {
    v11 = v9[3];
    v9 += 4;
    v8 += v11;
    if( v11 )
    {
      v12 = v11;
      do
      {
        v13 = 0i64;
        if( *(_BYTE *)v9 == 5 )
        {
          v13 = (unsigned int)v9[1];
          --v8;
        }
        v9 = (_DWORD *)((char *)v9 + v13 + 20);
        --v12;
      }
      while( v12 );
    }
    --v10;
  }
  while( v10 );
  if( !v8 )
    return 0i64;
  v14 = v3 + v8;
  v15 = 32i64 * v14;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v15 + 72, 1970499664i64);
  v17 = PoolWithTag;
  if( !PoolWithTag )
    return 0i64;
  memset(PoolWithTag, 0i64, v15 + 72);
  *((_DWORD *)v17 + 1) = *v4;
  v18 = a2[2];
  *((_DWORD *)v17 + 9) = v14;
  v19 = v17 + 9;
  *((_DWORD *)v17 + 12) = a3;
  v20 = 0;
  *((_DWORD *)v17 + 2) = v18;
  *(VOID **)((char *)v17 + 12) = 0i64;
  *(VOID **)((char *)v17 + 20) = 0i64;
  *((_DWORD *)v17 + 7) = 1;
  *((_DWORD *)v17 + 8) = 65537;
  *((_WORD *)v17 + 20) = -32767;
  *(_DWORD *)((char *)v17 + 42) = 3;
  *((_WORD *)v17 + 23) = 0;
  if( *a2 )
  {
    while( 1 )
    {
      if( v20 )
      {
        *(_DWORD *)((char *)v19 + 2) = 0;
        *(_WORD *)v19 = -4095;
        *((_WORD *)v19 + 3) = 0;
        v28 = *v4;
        if( *v4 == -1 )
          v28 = 1;
        *((_DWORD *)v19 + 2) = v28;
        *(VOID **)((char *)v19 + 12) = (VOID *)(unsigned int)v4[1];
        v19 += 4;
      }
      v21 = v4 + 4;
      v22 = 0;
      if( v4[3] )
        break;
LABEL_21:
      v4 = v21;
      if( (unsigned int)++v20 >= *a2 )
        goto LABEL_22;
    }
    while( 1 )
    {
      *(_BYTE *)v19 = 1;
      *((_BYTE *)v19 + 1) = *(_BYTE *)v21;
      *((_BYTE *)v19 + 2) = *((_BYTE *)v21 + 1);
      *((_WORD *)v19 + 2) = *((_WORD *)v21 + 1);
      *((_BYTE *)v19 + 3) = 0;
      *((_WORD *)v19 + 3) = 0;
      switch( *(_BYTE *)v21 )
      {
        case 1:
          goto LABEL_24;
        case 2:
          if( (*((_BYTE *)v21 + 2) & 2) != 0 )
          {
            *((_DWORD *)v19 + 3) = -2;
            v29 = *((unsigned __int16 *)v21 + 3);
            *((_DWORD *)v19 + 5) = 0;
            *((_DWORD *)v19 + 2) = ~v29;
            *((_WORD *)v19 + 8) = 4;
            *((_WORD *)v19 + 9) = *((_WORD *)v21 + 2);
            v27 = *(_QWORD *)(v21 + 3);
            goto LABEL_25;
          }
          v23 = v21[2];
          *((_DWORD *)v19 + 3) = v23;
          break;
        case 3:
          goto LABEL_24;
        case 4:
          if( *((char *)v21 + 2) < 0 )
          {
            *((_DWORD *)v19 + 2) = v21[2];
            *((_DWORD *)v19 + 3) = v21[2];
            *((_DWORD *)v19 + 4) = v21[1];
            *((_DWORD *)v19 + 5) = *((unsigned __int8 *)v21 + 12);
          }
          else
          {
            *((_DWORD *)v19 + 2) = v21[1];
            *((_DWORD *)v19 + 3) = v21[1];
          }
          goto LABEL_19;
        case 5:
          v5 = v21[1];
          goto LABEL_20;
        case 6:
          *((_DWORD *)v19 + 3) = v21[1];
          *((_DWORD *)v19 + 4) = v21[1] - 1 + v21[2];
          v23 = v21[2];
          break;
        case 7:
LABEL_24:
          Start = 0i64;
          v25 = RtlCmDecodeMemIoResource((PCM_PARTIAL_RESOURCE_DESCRIPTOR)v21, &Start);
          *((_DWORD *)v19 + 2) = v21[3];
          v26 = Start;
          v19[2] = (VOID *)Start;
          v27 = v26 + v25 - 1;
          *((_DWORD *)v19 + 3) = 1;
LABEL_25:
          v19[3] = (VOID *)v27;
          goto LABEL_19;
        default:
          *((_DWORD *)v19 + 2) = v21[1];
          *((_DWORD *)v19 + 3) = v21[2];
          *((_DWORD *)v19 + 4) = v21[3];
          goto LABEL_19;
      }
      *((_DWORD *)v19 + 2) = v23;
LABEL_19:
      v19 += 4;
LABEL_20:
      v21 = (_DWORD *)((char *)v21 + v5 + 20);
      ++v22;
      v5 = 0;
      if( v22 >= v4[3] )
        goto LABEL_21;
    }
  }
LABEL_22:
  result = v17;
  *(_DWORD *)v17 = (_DWORD)v19 - (_DWORD)v17;
  return result;
}

Referenced by:

IoReportResourceUsageInternal
IopAllocateBootResourcesInternal
IopQueryConflictListInternal
IopQueryDeviceResources
PnpFilterResourceRequirementsList
PnpReleaseBootResourcesForFilteredRequirements
PnpRestoreResourcesInternal