DmrEnumerateRmrrDomains

INT64 __fastcall DmrEnumerateRmrrDomains(UINT64 a1, INT64 a2, INT64 a3){
  _QWORD **v3; 
  INT64 v4; 
  INT64 v5; 
  UINT64 v7; 
  UINT64 i; 
  INT16 v9; 
  _QWORD *v10; 
  INT64 v11; 
  int v12; 
  CHAR *NextDeviceScope; 
  UINT64 v14; 
  CHAR *v15; 
  _WORD *NextRemappingStructure; 
  _WORD *v17; 
  *(_DWORD *)a3 = 0;
  v3 = (_QWORD **)(a3 + 8);
  v4 = a2;
  *(_QWORD *)(a3 + 16) = a3 + 8;
  *(_QWORD *)(a3 + 8) = a3 + 8;
  v5 = 0i64;
  while( 1 )
  {
    NextRemappingStructure = (_WORD *)DmrGetNextRemappingStructure(a1, v5);
    v17 = NextRemappingStructure;
    if( !NextRemappingStructure )
      break;
    if( *NextRemappingStructure == 1 )
    {
      v7 = (UINT64)NextRemappingStructure + (unsigned __int16)NextRemappingStructure[1];
      for( i = 0i64; ; i = (UINT64)v15 )
      {
        NextDeviceScope = (CHAR *)DmrGetNextDeviceScope((UINT64)(v17 + 12), v7, i);
        v15 = NextDeviceScope;
        if( !NextDeviceScope )
          break;
        if( *NextDeviceScope == 1 && (!v4 || DmrFindDrhdForDeviceScope(v14, v17[3], NextDeviceScope) == v4) )
        {
          v9 = v17[3];
          v10 = *v3;
          while( v10 != v3 )
          {
            v11 = (INT64)v10;
            v10 = (_QWORD *)*v10;
            if( *(_WORD *)(v11 + 32) == v9 && *(_BYTE *)(v11 + 34) == 1 && DmrCheckPathMatch(v15, (CHAR *)(v11 + 34)) )
              goto LABEL_13;
          }
          v11 = DmrpRmrrTreeAddNewScope(a3, v9, (UINT8 *)v15);
LABEL_13:
          if( !v11 )
          {
            v12 = -1073741670;
LABEL_23:
            DmrFreeRmrrTree(a3);
            return(unsigned int)v12;
          }
          v12 = DmrpRmrrTreeAddRegionToDevice(v11, *((_QWORD *)v17 + 1), *((_QWORD *)v17 + 2));
          if( v12 < 0 )
            goto LABEL_23;
          v4 = a2;
        }
      }
    }
    v5 = (INT64)v17;
    a1 = v14;
  }
  return 0;
}

Referenced by:

HalpIvtProcessDrhdEntry